SpringBoot自动装配原理简述

目录

1、问题的引出?

2、以一个简单的demo为例

        (1)spring boot主启动类

         (2)SpringBootApplication

         (3)@EnableAutoConfiguration

        (4) AutoConfigurationImportSelector.class 

         (5)spring-boot-autoconfigure-2.6.0.jar/META-INFO/spring.factories

3、以DataSourceAutoConfiguration为例进行自动装配

         (1)条件化注解

         (2)DataSourceAutoConfiguration.class

4、部分配置自定义

        (1)DataSourceAutoConfiguration.class

         (2)DataSourceProperties.class


1、问题的引出?

        当我们使用spring boot时,已不需要像spring MVC那样配置很多文件,只需要配置部分文件,而大部分的配置文件都由spring boot给我们做了!

2、以一个简单的demo为例

        (1)spring boot主启动类

        @SpringBootApplication是一个很重要的注解,可以近似的把它看作是三个注解之和;
 

SpringBoot自动装配原理简述_第1张图片

         (2)SpringBootApplication

        @SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration

                                                    + @ComponentScan

        @SpringBootConfiguration:表明它是一个SpringBoot项目的配置类

        @EnableAutoConfiguration:开启自动配置

        @ComponentScan:包扫描

        其中装配我们需要研究注解@EnableAutoConfiguration

SpringBoot自动装配原理简述_第2张图片

         (3)@EnableAutoConfiguration

        在@EnableAutoConfiguration这个注解类中导入了

        AutoConfigurationImportSelector.class这个类;

        这个类的作用是:加载自动配置类。

SpringBoot自动装配原理简述_第3张图片

        (4) AutoConfigurationImportSelector.class 

SpringBoot自动装配原理简述_第4张图片

        通过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的方式进行加载自动配置的类。 

SpringBoot自动装配原理简述_第5张图片

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,那就满足了自动装配数据源的第二个条件。

SpringBoot自动装配原理简述_第6张图片

4、部分配置自定义

        这里以DataSource为例

        (1)DataSourceAutoConfiguration.class

       @EnableConfigurationProperties(DataSourceProperties.class)

        这里代表以DataSourceProperties.class作为配置类,配置需要的信息。

SpringBoot自动装配原理简述_第7张图片

         (2)DataSourceProperties.class

        此类中有加载数据库所需要的参数。

SpringBoot自动装配原理简述_第8张图片

        @ConfigurationProperties({prefix = "spring.datasource"})

        此注解代表本类中的参数值可以在配置文件中进行配置,但需要增加前缀为spring.datasource

SpringBoot自动装配原理简述_第9张图片

         但此时注意如果要想成功在配置文件中配置,则配置类中一定要有对应参数的setter和getter方法,否则不能成功赋值。

SpringBoot自动装配原理简述_第10张图片

你可能感兴趣的:(后端,后端,spring,spring,boot)