spring启动流程
AnnotationConfigApplicationContext的构造方法
1.父类构造方法,构造一个DefaultListableBeanFactory
在调用AnnotationConfigApplicationContext的构造方法之前,会调用父类GenericApplicationContext的无参构造方法,会构造一个BeanFactory,为DefaultListableBeanFactory。
2.构造AnnotatedBeanDefinitionReader
同时对BeanFactory进行设置和添加PostProcessor
3.构造ClassPathBeanDefinitionScanner
(主要作用可以用来扫描得到并注册BeanDefinition),同时进行设置:
a.设置this.includeFilters = AnnotationTypeFilter(Component.class)
b.设置environment
c.设置resourceLoader
4.利用reader注册AppConfig为BeanDefinition
refresh()方法
1.prepareRefresh()
refresh()前戏,做容器刷新前的准备工作
a.记录容器启动时间,设置一些标志位
b.留给子类的一个模板方法,允许子类设置一些内容到Environment中
c.验证Environment中是否包括了必须要有的属性
2. obtainFreshBeanFactory()
返回一个DefaultListableBeanFactory,这里会执行refreshBeanFactory()判断容器能否重复刷新
ClassPathXmlApplicationContext继承了AbstractRefreshableConfigApplicationContext是可以刷新的,会执行bean的销毁逻辑,然后重新生成一个BeanFactory
AnnotationConfigApplicationContext继承了GenericApplicationContext,重复刷新会报错
3.prepareBeanFactory(beanFactory)
beanFactory的前戏,beanFactory的准备工作
a.设置beanFactory的类加载器
b.设置SpringEL表达式解析器
c.设置类型转化注册器
d.添加一个Bean的后置处理器:ApplicationContextAwareProcessor,用于处理回调
e.添加ignoredDependencyInterface:可以向这个属性中添加一些接口,如果某个类实现了这个接口,并且这个类中的某些set方法在接口中也存在,那么这个set方法在自动注入的时候是不会执行的,比如EnvironmentAware这个接口,如果某个类实现了这个接口,那么就必须实现它的setEnvironment方法,而这是一个set方法,和Spring中的autowire是冲突的,那么Spring在自动注入时是不会调用setEnvironment方法的,而是等到回调Aware接口时再来调用(注意,这个功能仅限于xml的autowire,@Autowired注解是忽略这个属性的)
f.添加resolvableDependencies:在byType进行依赖注入时,会先从这个属性中根据类型找bean
g.添加一个Bean的后置处理器:ApplicationListenerDetector,是一个BeanPostProcessor,用来判断某个Bean是不是ApplicationListener,如果是则把这个Bean添加到ApplicationContext中去
h.添加一个Bean的后置处理器:LoadTimeWeaverAwareProcessor
i.添加一些单例bean到单例池
i:"environment":Environment对象
ii:"systemProperties":系统的一些key-value值
iii:"systemEnvironment":JVM的一些key-value值
4.postProcessBeanFactory()
留给子类的模板方法,具体的子类,可以继续向BeanFactory中再添加一些东西
5.invokeBeanFactoryPostProcessors(beanFactory)
执行BeanFactoryPostProcessor
//TODO
6.registerBeanPostProcessors(beanFactory)
7. initMessageSource()
初始化国际化资源 ,让ApplicationContext拥有国际化的功能
8.initApplicationEventMulticaster()
初始化广播器,让ApplicationContext拥有事件发布的功能
9.onRefresh()
留给子类的模板方法,在特定上下文子类中初始化其他特殊 bean
10.registerListeners()
把实现了ApplicationListener的bean对象注册到ApplicationContext的事件广播器applicationEventMulticaster中去
11.finishBeanFactoryInitialization(beanFactory)
完成BeanFactory的初始化,主要就是实例化非懒加载的单例Bean
12.finishRefresh()
完成refresh()
Lifecycle的使用
Lifecycle表示的是ApplicationContext的生命周期,可以定义一个SmartLifecycle来监听ApplicationContext的启动和关闭:
@Component
public class KunkunLifecycle implements SmartLifecycle {private boolean isRunning = false;@Overridepublic void start() {System.out.println("启动");isRunning = true;}@Overridepublic void stop() {// 要触发stop(),要调用context.close(),或者注册关闭钩子(context.registerShutdownHook();)System.out.println("停止");isRunning = false;}@Overridepublic boolean isRunning() {return isRunning;}
}