当前位置: 首页 > news >正文

深圳做网站多钱百度网盘搜索引擎

深圳做网站多钱,百度网盘搜索引擎,销售做网站,夏天做那些网站能致富序言 之前我们用大量的篇幅介绍过invokeBeanFactoryPostProcessors()方法的执行流程。 而invokeBeanFactoryPostProcessors的主要逻辑就是遍历执行实现了BeanDefinitionRegistryPostProcesso类(主要是针对BeanDefinition的操作)和BeanFactoryPostProcessor(主要针对BeanFacrot…

序言

之前我们用大量的篇幅介绍过invokeBeanFactoryPostProcessors()方法的执行流程。
invokeBeanFactoryPostProcessors的主要逻辑就是遍历执行实现了BeanDefinitionRegistryPostProcesso类(主要是针对BeanDefinition的操作)和BeanFactoryPostProcessor(主要针对BeanFacroty的操作)
我们这篇文章里要介绍的registerBeanPostProcessors()方法 和 invokeBeanFactoryPostProcessors()方法类似,作用对象是Bean,用于在 Spring 容器实例化、配置和初始化 bean 的过程中提供自定义的扩展点。

源码

获取系统中实现BeanPostProcessor的类并进行分类,添加到BeanFacroty中。处理逻辑和BeanPosrProcessor基本相似。

	public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {//获取所有实现了BeanPostProcessor类的BeanNameString[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);// Register BeanPostProcessorChecker that logs an info message when// a bean is created during BeanPostProcessor instantiation, i.e. when// a bean is not eligible for getting processed by all BeanPostProcessors.//这里的 +1,应该是为了为下方的 new BeanPostProcessorChecker 留个位置//创建的BeanPostProcessorChecker是用来int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Separate between BeanPostProcessors that implement PriorityOrdered,// Ordered, and the rest.//用来存放实现riorityOrdered的BeanPostProcessorList<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();//用来存放实现MergedBeanDefinitionPostProcessor的BeanPostProcessorList<BeanPostProcessor> internalPostProcessors = new ArrayList<>();//用来存放实现Ordered的BeanPostProcessorList<String> orderedPostProcessorNames = new ArrayList<>();//用来存放没有实现排序接口的BeanPostProcessorList<String> nonOrderedPostProcessorNames = new ArrayList<>();//遍历获取所有的BeanPostProcessorfor (String ppName : postProcessorNames) {//判断是否实现了PriorityOrdered接口if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {//获取BeanPostProcessorBeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);//判断是否实现了MergedBeanDefinitionPostProcessor接口if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}//如果实现了Ordered接口,则添加到orderedPostProcessorNames中else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {//否则就是没有实现排序接口的类nonOrderedPostProcessorNames.add(ppName);}}// First, register the BeanPostProcessors that implement PriorityOrdered.//根据优先级进行排序sortPostProcessors(priorityOrderedPostProcessors, beanFactory);//注册(循环添加到BeanFactory的beanPostProcessors集合中)实现priorityOrder接口的BeanPostProcessorregisterBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// Next, register the BeanPostProcessors that implement Ordered.//注册(循环添加到BeanFactory的beanPostProcessors集合中)实现Ordered接口的BeanPostProcessorList<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());for (String ppName : orderedPostProcessorNames) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);orderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}sortPostProcessors(orderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, orderedPostProcessors);// Now, register all regular BeanPostProcessors.//最后注册(循环添加到BeanFactory的beanPostProcessors集合中)没有实现排序接口的BeanPostProcessorList<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());for (String ppName : nonOrderedPostProcessorNames) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);nonOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);// Finally, re-register all internal BeanPostProcessors.//重新注册(循环添加到BeanFactory的beanPostProcessors集合中)实现MergedBeanDefinitionPostProcessor接口的BeanPostProcessorsortPostProcessors(internalPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, internalPostProcessors);// Re-register post-processor for detecting inner beans as ApplicationListeners,// moving it to the end of the processor chain (for picking up proxies etc).//注册ApplicationListenerDetector,// 其实refresh()主流程方法下的prepareBeanFactory(beanFactory)方法中已经向beanFactory中添加了ApplicationListenerDetector//这里是重新注册,保证ApplicationListenerDetector在beanPostProcessors集合的最后//目的是检测并管理应用程序上下文中的事件监听器。beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));

扩展

值得说的地方是Spirng提供了几个比较重要的BeanPostProcessor接口可以用来进行扩展。因为其与四个接口都继承自BeanPostProcessor所以BeanPostProcessor中的方法他们也都有。
在这里插入图片描述
挨个接口来看看里面都有什么。

BeanPostProcessor
bean的后置处理器接口,在依赖注入的初始化方法前后进行调用。

/*** bean的后置处理器接口,在依赖注入的初始化方法前后进行调用*/
public interface BeanPostProcessor {/*** 初始化方法调用前要进行的处理逻辑*/@Nullabledefault Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}/*** 在初始化方法指定后要进行的处理逻辑*/@Nullabledefault Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean;}}

InstantiationAwareBeanPostProcessor
新增了属性注入的方法。

/*** 继承自BeanPostProcessor,添加了实例化前,实例化后,属性注入后的处理方法*/
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {//省略BeanPostProcessor方法.../*** 当使用注解的时候,通过这个方法来完成属性的注入*/@Nullabledefault PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)throws BeansException {return null;}/*** 属性注入后执行的方法,在5.1版本被废弃*/@Deprecated@Nullabledefault PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {return pvs;}}

SmartInstantiationAwareBeanPostProcessor
继承自InstantiationAwareBeanPostProcessor ,额外增加3个方法。

/*** 继承自InstantiationAwareBeanPostProcessor接口,增加了三个额外处理的方法,由spring内部使用**/
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {/*** 预测bean的类型,主要是在bean还没有创建前我们需要获取bean的类型**/@Nullabledefault Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {return null;}/*** 完成对构造函数的解析和推断*/@Nullabledefault Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)throws BeansException {return null;}/*** 解决循环依赖问题,通过此方法提前暴露一个合格的对象**/default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {return bean;}}

MergedBeanDefinitionPostProcessor
两个BeanDefinition合并时调用。

public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {/***spring通过此方法找出所有需要注入的字段,同时做缓存*/void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);/*** 用于在BeanDefinition被修改后,清除容器的缓存*/default void resetBeanDefinition(String beanName) {}
}

DestructionAwareBeanPostProcessor
判断Bean是否应该销毁和销毁时调用

public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {/*** 在bean被销毁前调用*/void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;/*** 判断是否要进行销毁,一般情况下都需要*/default boolean requiresDestruction(Object bean) {return true;}
}
http://www.15wanjia.com/news/42975.html

相关文章:

  • 汽车门户网站程序推广引流平台
  • thinkphp5做网站灰色关键词排名代做
  • 地产网站模板网站怎么做推广
  • b2b外贸网站建站国外网站排名 top100
  • 网站如何做注册类 cpa泰州seo公司
  • 哪些网站可以做微信推送windows优化大师怎么样
  • dremrever做网站流程培训体系包括四大体系
  • 长清网站建设网站建设介绍ppt
  • 厦门建设网站培训后的收获和感想
  • 东丽区 网站建设怎么开网站
  • 做网站花多钱怎样在百度做广告宣传
  • 江苏省建设工程集团黄山网站seo
  • 北京网站建设知名公司排名企业推广网站
  • dede复制网站给大家科普一下b站推广网站
  • 静态网站公用头部如何调用标题sem竞价推广是什么意思
  • 苏州能做网站创意营销新点子
  • 什么网站算是h5做的百度网址大全旧版本
  • 深圳宝安做网站做小程序的公司
  • 宁波网站建设的企业360指数官网
  • 大丰网站建设哪家好百度网站的网址是什么
  • 做网站横幅的图片多大平台优化是什么意思
  • wordpress 域名更换银川seo优化
  • 深圳外贸公司联系电话百度seo公司哪家最好
  • 池州网站制作公司南京seo推广优化
  • 企业营销型网站规划深圳整站全网推广
  • 青岛手机网站设计公司近期的新闻消息
  • 济南手机建站公司百度推广销售员好做吗
  • 网络营销是什么岗位seo网站建设优化
  • python 做网站武汉最新消息今天
  • 企业网站怎么做毕业设计中国国家培训网官网