一、什么是自动装配?
定义:SpringBoot的自动装配是指它能够根据应用程序的依赖和环境,自动决定应该应用哪些配置和装配哪些Bean,而无需开发者手动进行繁琐的配置。
SpringBoot自动装配的优点:
简化配置:自动装配机制能够根据应用程序的依赖和环境自动配置所需的组件,避免了繁琐的手动配置过程。
减少出错:由于自动装配是基于条件化配置的,因此可以避免手动配置过程中出现的错误和疏漏。
提高效率:自动装配机制能够显著提高开发效率,使开发者能够更专注于业务逻辑的实现。
总结:当开发者使用了SpringBoot开发系统后,伴随着自动装配的优点,开发者就不用在意配置文件的编写,更注重于业务的实现。
二、实现自动装配用到的注解
1.@Condition:
在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作。
@ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
@ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
@ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean
@ConditionalOnBean:判断环境中有对应Bean才初始化Bean
value值用来写判定条件,当成立时将对象加载到spring容器中,不成立则不加载。
2.@Enable
SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态启用某些功能的。而其底层原理是使用@Import注 解导入一些配置类,实现Bean的动态加载
可以从源码中发现,@Enable注解就是使用@import注解,而@import注解通常有以下四个用法:
3.EnableAutoConfigurtion主启动类
//@SpringBootApplication 来标注一个主程序类
//说明这是一个Spring Boot应用
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
//以为是启动了一个方法,没想到启动了一个服务
SpringApplication.run(SpringbootApplication.class, args);
}
}
主启动类的内部:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
// ......
}
以前我们需要自己配置的东西,而现在SpringBoot可以自动帮我们配置 ;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;
三、SpringBoot自动装配的实现原理
1.@SpringBootApplication是SpringBoot项目的主配置类,程序运行以及加载Bean对象都从SpringApplication.run()开始。
2.自动装配注解。代表自动装配
3.导入AutoConfigurationImportSelector类,进行自动装配的选择。
4.将自动装配的对象的list集合通过AutoConfigurationImportSelector类中的getAutoConfigurationEntry方法进行扫描返回。
5.扫描的getAutoConfigurationEntry方法中,去项目的所有目录的"META-INF/spring.factories"目录中扫描自动配置类。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));
ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).forEach(configurations::add);
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
6.将扫描的配置类以Map<String, List>的形式返回,键为工厂的名称,值为配置类的集合。
蓝色代表工厂
绿色代表集合
四、总结
Spring Boot 通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖