程序入口

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

SpringBootApplication注解其实是SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三个注解的组合;
SpringBootConfiguration可以理解为Spring版的Configuration注解;
EnableAutoConfiguration:这是SpringBoot自动配置的入口里面有两个关键点

**@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
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
}
从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个),按需加载所需配置类。

本篇文章来源于微信公众号: 小刘Java之路
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/11013.html