SpringBoot自动装配原理
SpringBoot的启动类上有一个注解:@SpringBootApplication 。该注解是三个注解的复合注解。
1.@SpringBootConfiguration 注解
点进@SpringBootConfiguration 注解,可以发现其核心注解为@Configuration注解:
@Configuration是一个类级别的注释,表明一个对象是 bean 定义的来源。@Configuration类通过带@Bean注解的方法声明 bean 。@Bean对@Configuration类方法的调用也可用于定义 bean 间的依赖关系
@Configuration在spring的注解开发中占有很重要的地位,你当你想要定义一个配置类并交给spring管理的时候你就可以在相关类上面加这个注解,并配合@Bean注解把对象交个spring去管理。
所以@SpringBootConfiguration 注解本质上就是一个@Configuration注解,用来标注某个类为 JavaConfig 配置类,有了这个注解就可以在 SpringBoot 启动类中使用```@Bean``标签配置类了,如下图所示。
2.@ComponentScan 注解
@ComponentScan是Spring注解之一,用于在Spring应用程序上下文中启用组件扫描。组件扫描是自动检测和注册 Spring bean(组件)到应用程序上下文中的过程。
这个扫描的范围是:SpringBoot 主启动类的同级路径及子路径,扫描到特定的@Component、@Service、@Controler、@Repository、@Configuration等等注解后,会做相应的bean注册和配置文件bean注册工作。
3.@EnableAutoConfiguration 注解
点进这个注解可以发现 @Import(AutoConfigurationImportSelector.class),如下图所示。
@Import是Spring注解之一,用于在配置类中导入其他配置类或者普通的Java类。
通过@Impor注解,我们可以将其他配置类或者普通的Java类导入到当前配置类中,从而实现对这些类的引用和使用。可以用于将多个配置类组合在一起,或者引入第三方库中的配置类。
说白了在这里@Import注解的作用就是将 AutoConfigurationImportSelector 这个类导入当前类,这个类就是实现自动装配的核心。在这里它会加载spring.factories文件。文件里面的内容也会统一加载到spring容器中。
spring.factories中的这一百多个配置类,是否生效也是有一定条件的。
比如说这里:
@ConditionalOnClass:说明要导入相关依赖当前配置类才会生效。
@ConditionalOnMissingBean:说明当前spring容器没有创建redisTemplate对象(某些情况我们要手动定制一些bean),它才会创建该对象放入spring容器中管理。
总结:
在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中 @EnableAutoConfiguration 是实现自动化配置的核心注解。
该注解通过 @Import 注解导入对应的配置选择器。关键的是内部就是读取了 该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。
在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要 将其导入到Spring容器中。
一般条件判断会有像 @ConditionalOnClass 这样的注解,判断是否有对应的 class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器 中使用。