标签:Springboot 启动 流程 springframework class 注解 org Configuration annotation
springboot的启动类入口
@SpringBootApplication
public class Boot01Helloworld2Application {
public static void main(String[] args) {
SpringApplication.run(Boot01Helloworld2Application.class, args);
}
}
从@SpringBootApplication注解以及SpringApplication.run进行对Springboot启动类的分析
@SpringBootApplication注解
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
//注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
//注解的生命周期,保留到class文件中(三个生命周期)
@java.lang.annotation.Documented
// 表明这个注解应该被javadoc记录
@java.lang.annotation.Inherited
// 子类可以继承该注解
@org.springframework.boot.SpringBootConfiguration
// 继承了Configuration,表示当前是Springboot注解类
@org.springframework.boot.autoconfigure.EnableAutoConfiguration
@org.springframework.context.annotation.ComponentScan(excludeFilters = {@org.springframework.context.annotation.ComponentScan.Filter(type = org.springframework.context.annotation.FilterType.CUSTOM, classes = {org.springframework.boot.context.TypeExcludeFilter.class}), @org.springframework.context.annotation.ComponentScan.Filter(type = org.springframework.context.annotation.FilterType.CUSTOM, classes = {org.springframework.boot.autoconfigure.AutoConfigurationExcludeFilter.class})})
public @interface SpringBootApplication {
@SpringBootConfiguration分析
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@Configuration注解上面有@Component注解,所以@Component有的功能@Configuration都有。@SpringBootConfiguration标注当前类会被扫描到IOC容器
@EnableAutoConfiguration分析
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
@AutoConfigurationPackage中
import org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar; 注册当前主程序类的同级以及子级中的包中符合条件的Bean的定义(如符合@Configuration)
@Import({AutoConfigurationImportSelector.class})
将所有符合条件(工厂类的实现类)的Bean的定义都加载到IOC容器
此注解顾名思义是可以自动配置,所以应该是springboot中最为重要的注解。
在spring框架中就提供了各种以@Enable开头的注解,例如: @EnableScheduling、@EnableCaching、@EnableMBeanExport等; @EnableAutoConfiguration的理念和做事方式其实一脉相承简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。
- @EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器【定时任务、时间调度任务】
- @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器【监控JVM运行时状态】
- @EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。
从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
可以从图中看出 AutoConfigurationImportSelector 实现了 DeferredImportSelector 从 ImportSelector继承的方法:selectImports。
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
AutoConfigurationEntry autoConfigurationEntry =getAutoConfigurationEntry(annotationMetadata);
标签:Springboot,启动,流程,springframework,class,注解,org,Configuration,annotation 来源: https://blog.csdn.net/Azathouth/article/details/120849850
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。