SpringBoot自动装配原理简述
1、问题的引出?
当我们使用spring boot时,已不需要像spring MVC那样配置很多文件,只需要配置部分文件,而大部分的配置文件都由spring boot给我们做了!
2、以一个简单的demo为例
(1)spring boot主启动类
@SpringBootApplication是一个很重要的注解,可以近似的把它看作是三个注解之和;
(2)SpringBootApplication
@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan @SpringBootConfiguration:表明它是一个SpringBoot项目的配置类 @EnableAutoConfiguration:开启自动配置 @ComponentScan:包扫描 其中装配我们需要研究注解@EnableAutoConfiguration
(3)@EnableAutoConfiguration
在@EnableAutoConfiguration这个注解类中导入了 AutoConfigurationImportSelector.class这个类; 这个类的作用是:加载自动配置类。
(4) AutoConfigurationImportSelector.class
通过SpringFactoriesLoader.loadFactoryNames(param, param)方法加载spring-boot-autoconfigure-2.6.0.jar/META-INFO/spring.factories文件来进行加载自动配置类。
(5)spring-boot-autoconfigure-2.6.0.jar/META-INFO/spring.factories
spring.factories中以key-value的方式进行加载自动配置的类。
3、以DataSourceAutoConfiguration为例进行自动装配
(1)条件化注解
(2)DataSourceAutoConfiguration.class
其中两个重要的条件注解 @ConditionalOnClass({ DataSource.class, EmbeddedDataBaseType.class}) 此时代表如果Classpath中有DataSource.class,和EmbeddedDataBaseType.class两个类,则满足了自动装配数据源的第一个条件。 @ConditionalOnMissingBean(type = {io.r2dbc.spi.ConnectionFactory}): 此时代表如果没有配置io.r2dbc.spi.ConnectionFactory这个bean,那就满足了自动装配数据源的第二个条件。
4、部分配置自定义
这里以DataSource为例
(1)DataSourceAutoConfiguration.class
@EnableConfigurationProperties(DataSourceProperties.class) 这里代表以DataSourceProperties.class作为配置类,配置需要的信息。
(2)DataSourceProperties.class
此类中有加载数据库所需要的参数。
@ConfigurationProperties({prefix = "spring.datasource"}) 此注解代表本类中的参数值可以在配置文件中进行配置,但需要增加前缀为spring.datasource
但此时注意如果要想成功在配置文件中配置,则配置类中一定要有对应参数的setter和getter方法,否则不能成功赋值。
