SpringBoot 组件扫描,SpringBoot 自动配置:

SpringBoot 组件扫描

@ComponentScan,在启动类前使用,可以指定扫描包路径,也可以按默认路径规则加载。

@ComponentScan(basePackages= {"cn.xdl"}) //指定扫描包路径
@ComponentScan //默认扫描当前包及子包组件

在包中的组件前面,需要使用@Controller、@Service、@Repository、@Component等扫描标记。

SpringBoot自动配置案例(DataSource、JdbcTemplate)

  1. 在pom.xml引入驱动包、spring-boot-starter-jdbc

    spring-boot-starter-jdbc(包含了spring核心容器、spring dao、hikari功能)

  2. 在application.properties定义db连接参数

     spring.datasource.username=SCOTT
     spring.datasource.password=TIGER
     spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
     #spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    
  3. 编写启动类,使用@EnableAutoConfiguration开启自动配置

    实例化SpringBoot容器获取DataSource对象和JdbcTemplate对象。

     @EnableAutoConfiguration
     public class RunBoot {
    
         public static void main(String[] args) {
             ApplicationContext ac = SpringApplication.run(RunBoot.class, args);
             DataSource ds = ac.getBean(DataSource.class);
             System.out.println(ds);
             JdbcTemplate template = ac.getBean(JdbcTemplate.class);
             System.out.println(template);
         }
    
     }
    

自动配置原理(自动配置类的加载过程)

  1. 内部定义了很多自动配置类,在xxx-autoconfigure.jar包的META-INF/spring.factories文件定义。
  2. 自动配置类,实际就是才用了@Configuration+@Bean标记实现了Bean定义
  3. 在开启@EnableAutoConfiguration标记后,会自动导入AutoConfigurationImportSelector组件,该组件内部调用SpringFactoriesLoader加载autoconfigure.jar包中的spring.factories文件,根据文件定义列表载入各个配置类
  4. 各个XxxAutoConfiguration配置类会创建相应对象载入Spring容器中,例如DataSource、JdbcTemplate、DispatcherServlet、HandlerMapping、RedisTemplate、MongoTemplate、RestTemplate等

提示: @ConditionalOnClass注解表示能找到指定的实现类才加载配置

##@SpringBootApplication

平时使用时采用@SpringBootApplication,等价于定义@SpringBootConfiguration+@ComponentScan+@EnableAutoConfiguration。

配置参数注入

将application.properties配置文件中定义的参数取出,写入到Bean对象属性中。

  • application.properties参数定义

      spring.datasource.username=SCOTT
      spring.datasource.password=TIGER
      spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
      #spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    
      db.user=root
      db.password=123456
    
  • 定义实体类

    DbParams实体类,在类前使用注解@ConfigurationProperties

      @Component
      @ConfigurationProperties(prefix="db")
      public class DbParams {
    
          private String user; //对应db.user=xxx
          private String password;//对应db.password=xxx
    
          public String getUser() {
              return user;
          }
          public void setUser(String user) {
              this.user = user;
          }
          public String getPassword() {
              return password;
          }
          public void setPassword(String password) {
              this.password = password;
          }
    
      }
    

    OracleParams实体类

      public class OracleParams {
    
          @Value("${spring.datasource.username}")
          private String user;
          private String password;
          private String url;
    
        public String getUser() {
            return user;
        }
        public void setUser(String user) {
            this.user = user;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getUrl() {
            return url;
        }
        public void setUrl(String url) {
            this.url = url;
        }

    }

在@Bean方法前使用注解@ConfigurationProperties

    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    public OracleParams params() {
        return new OracleParams();
    }