Spring Boot启动机制
本文基于spring-boot:1.0.0.RELEASE
初始化
SpringApplication.initialize
- 检测应用类型
- 获取并保存
ApplicationContextInitializer - 获取并保存
ApplicationListener - 检测启动的主类(根据
main函数)
启动
触发SpringApplicationRunListener.started
SpringApplicationRunListener只有一个实现类:EventPublishingRunListener
创建并配置Environment
创建,根据应用类型返回对应Environment,大部分情况都是web类型
web:StandardServletEnvironmentdefault:StandardEnvironment
配置内容
PropertySources:会读取命令行参数Profiles
触发SpringApplicationRunListener.environmentPrepared
ConfigFileApplicationListener负责读取配置文件(application.yml)
创建并配置Context
根据应用类型返回对应Context,大部分情况都是web类型
web:org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContextdefault:org.springframework.context.annotation.AnnotationConfigApplicationContext- 配置
ApplicationContextInitializer - 触发
SpringApplicationRunListener.contextPrepared load:注册主类的BeanDefinition- 触发
SpringApplicationRunListener.contextLoaded - 创建时会加载初始bean,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20name=org.springframework.context.annotation.internalConfigurationAnnotationProcessor
class=ConfigurationClassPostProcessor
interface=BeanDefinitionRegistryPostProcessor
name=org.springframework.context.annotation.internalAutowiredAnnotationProcessor
class=AutowiredAnnotationBeanPostProcessor
interface=MergedBeanDefinitionPostProcessor:BeanPostProcessor
name=org.springframework.context.annotation.internalRequiredAnnotationProcessor
class=RequiredAnnotationBeanPostProcessor
interface=MergedBeanDefinitionPostProcessor:BeanPostProcessor
# JSR-250,默认激活
name=org.springframework.context.annotation.internalCommonAnnotationProcessor
class=CommonAnnotationBeanPostProcessor
interface=InstantiationAwareBeanPostProcessor
# JPA support,默认未激活
name=org.springframework.context.annotation.internalPersistenceAnnotationProcessor
class=PersistenceAnnotationBeanPostProcessor
refresh
EmbeddedWebApplicationContext.refresh()
- 创建
BeanFactory,DefaultListableBeanFactory - 配置
BeanFactory
invokeBeanFactoryPostProcessors函数
执行BeanDefinitionRegistryPostProcessor相关实现类
ConfigurationClassPostProcessor:扫描所有Component并生成对应BeanDefinition- 注册bean:
ImportAwareBeanPostProcessor、EnhancedConfigurationBeanPostProcessor,根据优先级顺序注册,PriorityOrdered - 处理包括内部类、父类、
@Import、@Bean方法等,在ConfigurationClassParser.doProcessConfigurationClass - 扫描的
BeanDefinition的实现为ScannedGenericBeanDefinition,@Configuration的BeanDefinition实现为ConfigurationClassBeanDefinition - 使用
ConditionEvaluator判断是否加载该bean,根据@Conditional注解
- 注册bean:
PropertySourcesPlaceholderConfigurer:将变量${xxx}替换为配置的值- 包括:BeanDefinition、alias、embedded values
registerBeanPostProcessors函数
为BeanFactory添加BeanPostProcessor
- 添加
ApplicationListenerDetector,检测bean是否实现ApplicationListener接口
onRefresh
创建Tomcat容器
添加Listener
finishBeanFactoryInitialization
初始化所有非懒加载的bean:preInstantiateSingletons
AbstractAutowireCapableBeanFactory的populateBean方法会处理@Autowired注入- 后续触发
SpringApplicationRunListener.finished
Web应用的URL Mapping
- 自动配置:
WebMvcAutoConfiguration,引入starter-web即生效 - Mapping 类:
RequestMappingHandlerMapping - 开启实现:
@EnableWebMvc,配置类:DelegatingWebMvcConfiguration
AOP实现过程
- 自动配置:
AopAutoConfiguration,引入starter-aop即生效 - Bean后置处理器
AnnotationAwareAspectJAutoProxyCreator:Ordered,为之后的Bean生成代理 - 第一次调用时,会遍历所有bean,判断是否有相关注解(
@Aspeact) - 有AOP时返回bean的代理对象,没有则返回bean本身
- 创建核心代码:
AbstractAutoProxyCreator.createProxy,其中DefaultAopProxyFactory根据class类型判断代理方式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// DefaultAopProxyFactory.class
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class<?> targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
if (targetClass.isInterface()) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}