Spring Boot工作机制
通过Http://start.spring.io/创建一个最简单额依赖Web模块的SpringBoot应用,其启动类如下所示:
package com.example.demo20180607;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Demo20180607Application {
public static void main(String[] args) {
SpringApplication.run(Demo20180607Application.class, args);
}
}
如上最重要的注释就是@SpringBootApplication
@SpringBootApplication
它是一个组合注解:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}
其中重要的有三个注解:@Configuration、@EnableAutoConfiguration、@ComponentScan
@Configuration
SpringBoot社区推荐使用基于JavaConfig的配置形式,所以启动类标注了@Configuration之后,本身就是一个 IOC 容器配置类;
@EnableAutoConfiguration
@Enable*也是一个组合注解,其中包括@import,借助了@import的支持收集和注册特定场景相关的bean定义:
- @EnableAutoConfiguration的定义:
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.autoconfigure.AutoConfigurationImportSelector;
import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
import org.springframework.context.annotation.Import;
@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 {};
}
其中,最关键的是@Import({AutoConfigurationImportSelector.class}),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的 IoC 容器;
自动配置原理: SpringFactoriesLoader:从指定的配置文件(spring-boot-autoconfigure-2.0.2.RELEASE.jar!\META-INF/spring.factories)加载配置,spring.factories,配置格式Key=Value形式,只是Key、Value都是完整的类名。在 @EnableAutoConfiguration的场景中,他更多是提供一种配置查找的功能支持,根据 @EnableAutoConfiguration的完整类名 org.springframework.boot.autoconfigure.EnableAutoConfiguration 作为查找的Key,获取对应的一组@Configuration类。
# 截取 spring.factories 文件部分内容
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
...
SpringApplication程序启动的一站式解决方案
SpringApplication执行流程
https://www.processon.com/view/link/59812124e4b0de2518b32b6e
SpringApplicationRunListener
@SpringApplicationRunListener是 main () 执行过程中接收不同执行时点事件通知的监听者,无需自己实现,默认是实现了一个org.springframework.boot.context.event.EventPublishingRunListener,用于在SpringBoot启动的不同时点发布不同的应用事件类型(ApplicationEvent),如果有哪些ApplicationListener对这些事件感兴趣,则可以处理。
ApplicationListener
ApplicationContextInitializer
允许对ApplicationContext做进一步设置,只需要重写ApplicationContextInitializer的一个initialize()方法即可
CommandLineRunner
执行点:在SpringBoot应用的ApplicationContext完全初始化开始工作之后,main方法执行完成之前最后一步。建议CommandLineRunner的实现类使用 @org.springframework.core.annotation.Order进行标注或者实现org.springframework.core.Ordered接口,便于对他们的执行顺序进行调整。
参考
Springboot执行流程:https://www.cnblogs.com/trgl/p/7353782.html