BeanFactory后置处理器,该接口定义了postProcessBeanFactory方法,这个方法在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容,所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建 这个接口是BeanFactoryPostProcessor的子类,里面定义了postProcessBeanDefinitionRegistry方法,这个方法在所有bean定义信息将要被加载,bean实例还未创建的的时候执行。优先于BeanFactoryPostProcessor执行。利用BeanDefinitionRegistryPostProcessor给容器中再额外添加一些组件。 监听容器中发布的事件。 监听器的注册流程: SmartInitializingSingleton原理: 这里主要讲解spring 容器创建过程中的refresh过程。 -BeanFactory准备工作完成后进行的后置处理工作 前四步是beanFactory的创建及与准备阶段(标准初始化)。 先执行BeanDefinitionRegistryPostProcessor中的postProcessBeanDefinitionRegistry方法 不同接口类型的BeanPostProcessor;在Bean创建前后的执行时机是不一样的 MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取 子类(子容器)重写这个方法,在容器刷新的时候可以执行自定义逻辑 初始化所有剩下的单实例bean bean 初始化完成之后,registerDisposableBeanIfNecessary(beanName, bean, mbd),注册bean的销毁方法 到这里,bean就创建完成了。 IOC容器就是很多的Map,里面保存了bean的信息、环境信息等各种各样的信息 所有Bean都利用getBean创建完成以后,检查所有的Bean是否是SmartInitializingSingleton接口的,如果是,就执afterSingletonsInstantiated()。 至此,容器创建及初始化完成 3.后置处理器;BeanPostProcessor 每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能; ApplicationListener;事件监听; 参考:文章目录
1. Spring扩展原理
1.1 BeanFactoryPostProcessor
1.2 BeanDefinitionRegistryPostProcessor
依次触发所有的postProcessBeanDefinitionRegistry()方法
再来触发postProcessBeanFactory()方法BeanFactoryPostProcessor;1.3 ApplicationListener
public interface ApplicationListener<E extends ApplicationEvent>
监听ApplicationEvent以及子类
ContextRefreshedEvent:容器刷新完成(所有bean都完全创建)会发布这个事件;
ContextClosedEvent:关闭容器会发布这个事件;
applicationContext.publishEvent()
applicationContext.publishEvent(new ApplicationEvent(new String("自定义event")) { });
publishEvent(new ContextRefreshedEvent(this))
,发布ContextRefreshedEvent事件
getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType)
事件多播器的任务就是调用multicastEvent()方法,通知所有listener,事件发布了,listener执行相应的onApplicationEvent方法。
事件多播器的获取流程:
如果容器中有,就拿出来赋给applicationEventMulticaster
如果没有,就创建一个SimpleApplicationEventMulticaster,并且加入到容器中,我们就可以在其他组件要派发事件时,自动注入这个applicationEventMulticaster
//获取所有的listener String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false); for (String listenerBeanName : listenerBeanNames) { //将listener注入到多播器中 getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); }
指定某个方法监听某个事件,比如指定UserService类中的listen方法监听ApplicationEvent事件@Component public class UserService { @EventListener(classes=ApplicationEvent.class)//classes为要监听的类型,可以是数组 public void lisetn(ApplicationEvent event){ System.out.println("UserService..."+event); } }
@EventListener 注解,使用EventListenerMethodProcessor处理器来解析方法上的@EventListener,EventListenerMethodProcessor实现了SmartInitializingSingleton接口,这个接口只有一个afterSingletonsInstantiated方法。这个方法会在所有单实例bean已经全部被创建完之后执行。
先创建所有的单实例bean,getBean();
获取所有创建好的单实例bean,判断是否是SmartInitializingSingleton类型的;
如果是就调用afterSingletonsInstantiated();2. Spring 容器创建过程
2.1 prepareRefresh()
2.2 obtainFreshBeanFactory()
public GenericApplicationContext() { this.beanFactory = new DefaultListableBeanFactory(); }
2.3 prepareBeanFactory(beanFactory)
BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
environment【ConfigurableEnvironment】
systemProperties【Map<String, Object>】
systemEnvironment【Map<String, Object>】2.4 postProcessBeanFactory(beanFactory)
2.5 invokeBeanFactoryPostProcessors(beanFactory)
两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
2.6 registerBeanPostProcessors(beanFactory)
BeanPostProcessor接口
DestructionAwareBeanPostProcessor、
InstantiationAwareBeanPostProcessor、
SmartInstantiationAwareBeanPostProcessor、
MergedBeanDefinitionPostProcessor【internalPostProcessors】
beanFactory.addBeanPostProcessor(postProcessor);
applicationContext.addApplicationListener((ApplicationListener<?>) bean)
,注册到容器中2.7 initMessageSource()
2.8 initApplicationEventMulticaster()
SimpleApplicationEventMulticaster,并且在容器中注册,方便在其他地方使用2.9 onRefresh()
2.10 registerListeners()
2.11 finishBeanFactoryInitialization(beanFactory)
判断是否是实现FactoryBean接口的Bean;
不是工厂Bean。利用getBean(beanName)创建对象,这个getBean和ApplicationContext.getBean是同一个方法
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256)
获取getSingleton(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } 。。。 } });
Object bean = resolveBeforeInstantiation(beanName, mbdToUse)
,让BeanPostProcessor先拦截返回代理对象‘
先执行:postProcessBeforeInstantiation(),bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName)
如果有返回值:触发postProcessAfterInitialization();
利用工厂方法或者对象的构造器创建出Bean实例
赋值之前
拿到InstantiationAwareBeanPostProcessor后置处理器,执行postProcessAfterInstantiation方法
拿到InstantiationAwareBeanPostProcessor后置处理器,执行postProcessPropertyValues方法
赋值:applyPropertyValues(beanName, mbd, bw, pvs),应用Bean属性的值;为属性利用setter方法等进行赋值;
BeanPostProcessor.postProcessBeforeInitialization()
是否是InitializingBean接口的实现;执行接口规定的初始化方法;
是否自定义初始化方法;
BeanPostProcessor.postProcessAfterInitialization()
创建完成之后,将创建的Bean添加到缓存中singletonObjects,addSingleton(beanName, singletonObject)2.12 finishRefresh()
默认从容器中找是否有LifecycleProcessor的组件【LifecycleProcessor】,如果没有就新建一个DefaultLifecycleProcessor,并加入到容器中
可以写一个类实现LifecycleProcessor接口,重写onRefresh()、onClose()方法,在beanFactory刷新完成或者close后回调相关方法3. 总结
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
xxx…
增强的功能注解:
AsyncAnnotationBeanPostProcessor
…
ApplicationEventMulticaster;事件派发:
Spring注解驱动教程
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算