Spring Boot 自动装配
愚见
- @Configuration + @Bean 用于注册bean
- Spring 不会将 第三方的包 注册 为bean
- Spring 只会管理 当前包 和 子包 里面的类
- Spring 可以 通过 @Import 注解引入第三方包 里面的类
- 理解自动装配主要需要 解决 以下三个问题
一、自动装配做了什么?
- 自动装配:提前将默认配置实现好,然后判断项目中是否有 手动配置;如果有就覆盖,没有则使用默认配置。这就是 默认 > 手动,默认兜底的思想。
- 具体实现:创建 Java 配置类,实现默认配置,通过 注解 交给Spring 容器管理
二、第三方包的配置类是如何交给 Spring 容器管理的?
- 第三方包里面的配置类 也是通过 Spring 注解 @Configuration + @Bean ,将配置类加载到 Spring 容器中的
- 以阿里巴巴的数据库连接池 Druid 的 start 包 druid-spring-boot-starter-1.1.14.jar举例:
用 @Configuration + @Bean 注册bean
用 @ConditionalOnClass()、@ConditionalOnMissingBean() 条件注解 控制 bean 是否注册
用 @AutoConfigureBefore() 控制 bean 注册顺序
用 @EnableConfigurationProperties() 注册 读取配置文件的类(DruidStatProperties)为 bean
用 @Import() 导入其他类 交给 Spring 管理
package com.alibaba.druid.spring.boot.autoconfigure;
@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);
public DruidDataSourceAutoConfigure() {
}
@Bean(
initMethod = "init"
)
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
}
三、Spring Boot 是如何扫描到第三方包的?
- Spring Boot 扫描所有路径下面的 spring.factories 文件
- 读取 spring.factories 文件里面的 类全名配置
- Spring Boot 通过 ImportSelector 接口的实现类 :AutoConfigurationImportSelector ,将 读取到的类 交给 Spring 管理
- ImportSelector 接口的作用
将 多个类 通过类全名的方式,交给 Spring 管理
public class Myclass implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.yc.Test.TestDemo2","com.yc.Test.TestDemo1"};
}
}
@Import({Myclass.class})
public class TestDemo {
@Bean
public AccountDao2 accountDao2(){
return new AccountDao2();
}
}
- spring.factories 文件
druid-spring-boot-starter-1.1.14.jar/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
引用
如有不当之处,敬请指正