文章目录
1、@SpringBootApplication -- SpringBoot的核心注解2、SpringApplication的执行流程3、SpringApplication的扩展点1、@SpringBootApplication -- SpringBoot的核心注解
@SpringBootApplication 内含3个子注解:1.1、@Configuration
该注解用于JavaConfig中,被该注解标注的表示,该类是个配置类。1.2、@ComponentScan
自动扫描注解,扫描路径下的组件或者Bean1.3@EnableAutoConfiguration
@EnableAutoConfiguration是个复合注解,源代码如下@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import({EnableAutoConfigurationImportSelector.class})public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class [] exclude() default {}; String[] excludeName() default {};}
@EnableAutoConfiguration 最关键的是@Import({EnableAUtoConfigurationImportSelector.class}) 注解。
该注解的功能是帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot应用1.4自动配置的幕后英雄:SpringFactoriesLoader
该类的作用是加载SpringBoot应用下META-INF/spring.factories配置文件。该配置文件是一个Properties文件。在spring-boot 和 spring-boot-autoconfig 的META-INF/spring.factories中定义了自动配置的类1.5@EnableAutoConfiguration综述
通过1.3、1.4的描述。@EnableAutoConfiguration的作用可以描述为:从classpath下搜寻所有的META-INF/spring.factories配置文件,并将EnableAutoConfiguration对应的配置项通过反射实例化为对应标注了@Configuration的IoC容器配置类,然后汇总为一个并加载到IoC容器中2、SpringApplication的执行流程
2.1、SpringApplication在实例化之前
2.1.1、SpringApplication在实例化之前会根据你的应用决定创建web类型或者是标准的ApllicationContext2.1.2、使用SpringFactoriesLoader在classpath下查找并加载所有可用的ApplicationContextInitializer2.1.3、使用SpringFactoriesLoader在classpath下查找并加载所有可用的ApplicationListener2.2、SpringApplication实例化完成并设置之后
1、通过SpringFactoriesLoader加载SpringApplicationRunListener(创建监听器)2、创建应用需要的Environment(创建应用所需环境)3、Environment创建完毕,SpringApplicationRunListner调用environmentPrepared()。(通知完毕)4、根据当前应用创建ApplicationContext5、调用ApplicationContextInitialzer,对ApplicationContext进一步处理(进一步处理)6、处理完毕,SpringApplicationRunListner调用contextPrepared().(通知完毕)7、将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContex8、SpringApplicationRunListener调用contextLoader()。(通知完毕)9、调用ApplicationContext的refresh()。完成IoC容器可以的最后一道程序10、调用SpringApplicationRunListener的finish()。(通知完成)
3、SpringApplication的扩展点
1、SpringApplicationRunListner(事件通知的监听者)
实现请参考-->默认实现类--EventPublishingRunListener2、ApplicationListener(监听某类事件的发生)
Demo:public class Listener implements ApplicationListener{ @Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { }}
3、ApplicationContextInitializer(进一步处理ApplicationContext)
Demopublic class Demo implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplictionContext application)}
4、CommandLineRunner
CommandLineRunner的执行点在main方法执行完成之前最后一步SpringBoot中的所有CommandLineRunner都会被加载执行CommandLinerRunner 最好使用@Ordered注解标注顺序