AnnotationConfigApplicationContext初始化refresh()&bean工厂后置处理器
2020-06-19 10:53:00 0 举报
AnnotationConfigApplicationContext初始化refresh()&bean工厂后置处理器
作者其他创作
大纲/内容
重新添加ApplicationListenerDetector
/*初始化获取beanfactory:获取所有bean的信息 * 初试化spring内置的bean * 初试化配置文件指定的bean 比如spring2.xml * 初试化注册的配置类比如appconfig*/ ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
用户自定义的后置处理器
子类实现: springboot 内嵌容器 ioc启动带动tomcat启动
为刷新此上下文 做准备
最后一步:执行扩展点
解析注解,注册对应的bean
applicationContexts.add(applicationContext);
执行postProcessBeanFactory
初始化特定上下文子类中的其他特殊bean--空方法
registerBeanPostProcessors(beanFactory);
initMessageSource();
registerApplicationContext
为此上下文初始化 事件多播程序
只是指定了序列号,然后直接返回beanFactory(不用创建,容器中已存在)
这种方式,在开发中也可以借鉴,一个方法中同类型的集合不用定义多个,第一个使用完清空,让第二个接着用
按bean工厂后置处理器是否实现注册接口分两类:BeanDefinitionRegistryPostProcessor(对bean的属性进行填充)和BeanFactoryPostProcessor(注册bean)
执行优先级:实现PriorityOrdered接口来指定顺序的>@Ordered指定顺序的>剩余的后置处理器
为此上下文初始化消息源
registerListeners();
注册拦截bean创建的bean后置处理器器
GenericApplicationContext#refreshBeanFactory
先执行BeanDefinitionRegistryPostProcessor
finishRefresh();
postProcessBeanFactory(beanFactory);
注册了beanDefinition的后置处理器通过getObject获取
准备bean工厂以供在此上下文中使用:
AbstractApplicationContextrefresh();
//将当前执行的list清空currentRegistryProcessors.clear();
如果存在beanFactory,先销毁单例bean,关闭beanFactory,再创建beanFactory(DefaultListableBeanFactory类型),为beanFactory设置序列号,注册xml配置的bean,最后指定为容器的beanfactory
ClassPathXmlApplicationContext
清除各类reSources缓存
onRefresh();
finishBeanFactoryInitialization(beanFactory);
prepareBeanFactory(beanFactory);
初始化生命周期处理器
invokeBeanFactoryPostProcessors(beanFactory);
AbstractRefreshableApplicationContext#refreshBeanFactory
空方法,以备使用者对其扩展
删除旧的,移到处理器链末尾
// 设置它的启动日期和活动标志,并执行初始化的环境 prepareRefresh();
完成对@Configuration修饰的配置类进行动态增强--通过字节码技术进行spring的CGLIB的动态代理
先执行PriorityOrdered,然后清空,再执行实现Order的,清空,最后执行剩余的
AnnotationConfigApplicationContext
initApplicationEventMulticaster();
重置“active”flag。cancelRefresh(ex);
添加Spring自身的BeanPostProcessorChecker、CommonAnnotationBeanPostProcessor 、AutowiredAnnotationBeanPostProcessor
invokeBeanFactoryPostProcessors
拿到当前上下文的bean工厂后置处理器,实例化并调用所有已注册的bean工厂后置处理器
抛出异常BeansException
初始化的核心
调用用户自定义的没有实现注册器的后置处理器所实现的后置处理的方法
检查侦听器bean并注册它们
发布相应的事件
销毁已经创建的单例,以避免挂起资源。destroyBeans();
按执行优先级进行排序:实现PriorityOrdered接口来指定顺序的>@Ordered指定顺序的>剩余的后置处理器
实例化所有剩余的(非惰性初始化)单例--》创建bean就是在这一步完成
可以处理内部方法bean之间的调用,防止多例
0 条评论
下一页