@PostConstruct 注解:
标注此方法method需要在依赖注入后,提供服务前执行。即initMethod方法
Constructor > @Autowired > @PostConstruct
@ConfigurationProperties(prefix = "yamlkey1.key2")
@EnableConfigurationProperties({ClassName.class})
spi机制实例化所有spring.factories中的配置的ApplicationListener(应用监听器)和ApplicationContextInitializer(应用上下文初始化器)
发布一个ApplicationStartingEvent应用开始启动事件,通过SpringApplicationRunListener.Multicaster广播到所有应用监听器中,所有应用监听器自己判断是否支持此事件类型并执行。
事件内容包括:
LoggingApplicationListener:初始化 SLF4JBridgeHandler
BackgroundPreinitializer:初始化 ConversionServiceInitializer/ValidationInitializer/MessageConverterInitializer/JacksonInitializer/CharsetInitializer
DelegatingApplicationListener:委托其他context.listener.classes(逗号分隔)配置的监听器来处理此事件
根据应用类型准备初始环境Environment。根据applicationType创建对应环境对象,初始化对象时就能获取到systemProperties(JDK环境信息)和systemEnvironment(系统环境信息),并将当前启动命令行参数commandLineArgs加入到Environment中。再发布ApplicationEnvirmentPreparedEvent应用环境准备完成事件,由Multicaster广播到所有应用监听器中,各监听器自己判断是否支持此事件。
事件内容包括:
ConfigFileApplicationListener:
spi获取PropertySourceLoader配置的后置处理器:
SystemEnvironmentPropertySourceEnvironmentPostProcessor:将systemEnvironment转为SystemEnvironmentPropertySource对象放到现有的Environment中
SpringApplicationJsonEnvironmentPostProcessor:将spring.application.json配置解析并放到Environment中
CloudFoundryVcapEnvironmentPostProcessor:加载vcap配置
ConfigFileApplicationListener:加载工程中application的properties或yaml/yml配置
LoggingApplicationListener:初始化日志相关的logging配置
DelegatingApplicationListener:委托其他context.listener.classes(逗号分隔)配置的监听器来处理此事件
设置忽略beaninfo信息为真
打印banner
根据应用类型初始化context。servlet类型初始化AnnotationConfigServletWebServerApplicationContext实例,内部包含AnnotatedBeanDefinitionReader(含注解的BD读取类)实例和ClassPathBeanDefinitionScanner(classpath内BC范围扫描类)实例。
AnnotatedBeanDefinitionReader:
包含三个成员对象:
AnnotatedBeanNameGenerator:可能含注解的类的bean名称获取,例如@Component注解则取其value为bean名称,否则默认去对象短类名
ScopeMetadataResolver:@Scope代理标签的解析类。此处代理是指生成的BD是否为原BD的代理。NO默认的级别表示不需要代理,INTERFACES表示JDK动态代理,TARGET_CLASS表示cglib代理
ConditionEvaluator:判断是否符合@Confitional注解条件
并初始化生成BeanFactory:
设置默认的AnnotationAwareOrderComparator(用于支持比较bean依赖时的@Order/@Priority优先级)
设置默认的ContextAnnotationAutowireCandidateResolver(@Lazy/@Qualifier/@Value以及自动注入时相关判断)(@Value格式为#{key_name:默认值})
注册相关根BD到BeanFactory中:
ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationProcessor
PersistenceAnnotationBeanPostProcessor
EventListenerMethodProcessor
EventListenerFactory
ClassPathBeanDefinitionScanner:
也包含下列两个成员对象:
AnnotatedBeanNameGenerator
AnnotationScopeMetadataResolver
同时includeFilters中添加AnnotationTypeFilter注解过滤器,用来过滤所有[包括继承注解]@Component/@ManagedBean/@Named @Component也在@Repository/@Service/@Controller中
解析META-INF/spring.components中定义的候选组件加到缓存中
spi获取SpringBootExceptionReporter->spi获取FailureAnalyzers->具体Analyzer 配置的所有异常记录器实例。此后步骤出现异常将由对应的异常分析器来解析错误
未完待续
SpringApplicationRunListener.Multicaster 如何判断是否支持此事件?
1.应用监听器实现了ApplicationListener<泛型:支持的事件类型>,通过泛型支持的事件类型是否当前传入类型的子类确定。泛型为空表示支持所有事件
2.应用监听器实现了SmartApplicationListener,通过重写的supportsEventType()判断是否支持此事件
注:应用监听器中具体事件执行的逻辑方法为onApplicationEvent()
ConfigFileApplicationListener加载工程配置是怎么实现的?
解析配置的默认占位符为:#{:}
配置配置的默认位置为:classpath:/,classpath:/config/,file:./,file:./config/
配置文件名称默认为application也可以自己设置spring.config.name
spi机制实例化所有spring.factories中的配置的PropertySourceLoader
1.PropertiesPropertySourceLoader:加载properties/xml格式配置文件
2.YamlPropertySourceLoader:加载yml/yaml格式配置,会将‘---’定义的配置文件分割开,并解析确认spring.profiles.active和spring.profiles.include
spring的spi路径为SpringFactoriesLoader(META-INF/spring.factories)
jdk的spi为ServiceLoader(META-INF/services/类名)



