欢迎光临散文网 会员登陆 & 注册

Java四十四篇:springboot 的自动装配

2023-03-14 00:36 作者:小刘Java之路  | 我要投稿

程序入口

image.png

由springboot的自动配置原理,其入口是@SpringBootApplication注解

image.png

SpringBootApplication注解其实是SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三个注解的组合;

SpringBootConfiguration可以理解为Spring版的Configuration注解;

EnableAutoConfiguration:这是SpringBoot自动配置的入口里面有两个关键点

image.png

**@AutoConfigurationPackage:**设置SpringBoot自动扫描包点路径,当basePackages或basePackageClasses属性没有指定包扫描路径时默认从启动类所在当包开始扫描;

**@Import(AutoConfigurationImportSelector.class:**通过Import注解向Spring容器中注入一个类为AutoConfigurationImportSelector的bean,AutoConfigurationImportSelector实现了DeferredImportSelector类,该类中的getAutoConfigurationEntry方法中会将spring-boot-autoconfigure包下Resource/META-INF/spring.factories文件中以EnableAutoConfiguration为key值的所有配置类读取并筛选出来,这里面的类都是配置类,和我们自己写的以@Configuration标注的配置类作用相同,这里面基本包含了目前常用的组件配置。

解释

1.Springboot启动后,读取程序的启动类时,就会读取到@SpringBootApplication


2.@SpringBootApplication注解又包含了 @EnableAutoConfiguration注解


3.@EnableAutoConfiguration注解导入了AutoConfigurationImportSelector类,

4.@AutoConfigurationPackage :自动配置包


5.AutoConfigurationImportSelector.class中,定义了一个方法getCandidateConfigurations,进入getCandidateConfigurations方法,getCandidateConfigurations会到classpath下的读取META-INF/spring.factories文件的配置


6.spring.factories文件在spring-boot-autoconfigure-2.3.7.RELEASE.jar的META-INF中,spring.factories文件中声明了很多java配置类,但是每个配置类都是需要满足一定的条件才会执行(例如: @ConditionalOnClass 、 @ConditionalOnProperty、 @ConditionalOnMissingBean等)

image.png


7.随便打开一个自动配置文件,比如说WebMvcAutoConfiguration.class


WebMvcAutoConfiguration这个类中使用的注解可以看出,要完成自动配置是有依赖条件的。

这些是springboot特有的,常见的条件依赖注解有:

@ConditionalOnSingleCandidate,仅在当前上下文中存在某个bean时,才会实例化这个Bean。

@ConditionalOnClass,某个class位于类路径上,才会实例化这个Bean。

@ConditionalOnExpression,当表达式为true的时候,才会实例化这个Bean。

@ConditionalOnMissingBean,仅在当前上下文中不存在某个bean时,才会实例化这个Bean。

@ConditionalOnMissingClass,某个class在类路径上不存在的时候,才会实例化这个Bean。

@ConditionalOnNotWebApplication,不是web应用时才会实例化这个Bean。

@AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean。

@AutoConfigureBefore,在某个bean完成自动配置前实例化这个bean。

所以,自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。

总结

1、@Configuration&与@Bean->基于java代码的bean配置

2、@Conditional->设置自动配置条件依赖

3、@EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。

4、@EnableAutoConfiguration、@AutoConfigurationPackage 与@Import->实现bean发现与加载。

5、@EnableAutoConfiguration自动配置从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

springboot启动加载所有的配置类(127个),按需加载所需配置类。

img


Java四十四篇:springboot 的自动装配的评论 (共 条)

分享到微博请遵守国家法律