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)条件化注解

条件化注解 配置生效条件 @ConditionalOnBean 配置了某个特定的Bean @ConditionalOnMissingBean 没有配置特定的Bean @ConditionalOnClass Classpath里有指定的类 @ConditionalOnMissingClass Classpath里缺少指定的类 @ConditionalOnExpression 给定的SpEL表达式计算结果为true @ConditionalOnJava Java的版本匹配特定值或者一个范围值 @ConditionalOnJndi 参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI的InitialContext @ConditionalOnProperty 指定配置属性中要有一个明确的值 @ConditionalOnResource Classpath里有指定的资源 @ConditionalOnWebApplication 这是一个Web应用程序 @ConditionalOnNotWebApplication 这不是一个Web应用程序

(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方法,否则不能成功赋值。
经验分享 程序员 微信小程序 职场和发展