=总结=
1)、 spring容器在启动的时候,会保存注册进来的所有的bean信息
1) xml注册bean
2) 解释注册bean @service @component @Import @Condition @bean @ImportSelector @ImportBeanDefinationRegister factoryBean<?>接口
2)、 spring容器会合适的时机创建这些bean
1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
2)、统一创建剩下所有的bean的时候,finishBeanFactoryInitialization()
3)、 后置处理器
1)、 每一个bean创建完成都会使用各种后置处理器 来增强bean的功能
ConfigurationClassPostProcessor @import
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectAutoProxyCreator:来做AOP功能;
BeanValidationPostProcessor 数据校验
InitDestroyAnnotationBeanPostProcessor @PostConstruct的执行 为bean赋值后执行 populateBean(beanName, mbd, instanceWrapper) -> initializeBean(beanName, exposedObject, mbd)
4)、 事件驱动模型
1)、 ApplicationEventMulticaster 事件派发器(事件多播器)
原理: 1.容器创建东西会调用refresh方法 initApplicationEventMulticaster();初始化事件开发器 如没有则创建SimpleApplicationEventMulticaster
2.registerListeners(); 获取到容器中所有的listener getApplicationEventMulticaster().addApplicationListener(listener);
2)、 ApplicationListener 事件监听器
原理(容器刷新完成会发布ContextRefreshedEvent事件):
1.finishRefresh();方法中
2.publishEvent(new ContextRefreshedEvent(this)); 发布事件
3.获取到派发器getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType)派发事件
4.for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {循环(如果有executor支持异步派发事件)
5.拿到listener调用 onApplicationEvent()
eg: 在容器发布事件的时候获取所有的事件监听器执行onApplicationEvent()方法
EventListener注解->解析类EventListenerMethodProcessor实现了SmartInitializingSingleton接口->在finishBeanFactoryInitialization创建完bean后执行
BeanDefinitionRegistry是bean定义信息的保存中心
5).beanPostProcessor执行顺序
1.BeanDefinitionRegistryPostProcessor
2.BeanFactoryPostProcessor
3.InstantiationAwareBeanPostProcessors .postProcessBeforeInstantiation(AOP的AspectJAwareAdvisorAutoProxyCreator 创建代理对象)
4.InstantiationAwareBeanPostProcessors .postProcessAfterInitialization (Before执行成功有返回则执行后创建成功)
5.bean实例化
5.MergedBeanDefinitionPostProcessor .postProcessMergedBeanDefinition();修改bean实例属性 (InitDestroyAnnotationBeanPostProcessor 即 @PostConstruct注解)
6.SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference()
7.bean赋值
8.执行aware接口的方法(如果这个bean是BeanNameAware, BeanClassLoaderAware, BeanFactoryAware)
9.BeanPostProcessor.postProcessBeforeInitialization()
10.执行实现了InitializingBean初始化方法 和 正常的初始化方法
11.BeanPostProcessor.postProcessAfterInitialization()
Spring容器创建总结
最新推荐文章于 2022-04-21 20:11:15 发布