spring(十五)---------BeanPostProcessor之spring中各种现象的解释

1、现象一:实现了BeanFactoryPostProcessor的类无法解析@Autowired、@PostConstruct,但可以执行InitializingBean接口的实现方法afterPropertiesSet。

@Component
public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor, InitializingBean {

//无法注入
	@Autowired
	BeanPostProcessorService beanPostProcessorService;

//无法执行
	@PostConstruct
	public void postConstruct(){
		log.debug("TestBeanFactoryPostProcessor PostConstruct init");
	}

//可以执行
	@Override
	public void afterPropertiesSet() throws Exception {
		log.debug("TestBeanFactoryPostProcessor InitializingBean init");
	}

//可以执行
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		log.debug("TestBeanFactoryPostProcessor beanPostProcessorService[{}]",beanPostProcessorService);
	}


}

2、现象二:两个类都实现了BeanPostProcessor,一个在其中注入一个普通bean,一个在后置处理器中获取该bean并修改其属性值,此时后者的后置方法无法获取到这个bean。(@Autowired、@PostConstruct可以生效,且可以执行InitializingBean接口的实现方法afterPropertiesSet)

普通bean:

@Component("a")
public class BeanPostProcessorService {

	String str;
	Integer i;
	public BeanPostProcessorService(){
		log.debug("==BeanPostProcessorService create");
	}
	public Integer getI() {
		return i;
	}
	public String getStr() {
		return str;
	}
	public void testAop(){
		log.debug("--------BeanPostProcessorService logic-----");

	}

}

第一个实现了BeanPostProcessor的类,注入了这个bean(能够成功注入进来),且    @PostConstruct可以生效,InitializingBean 的after方法也可以生效

@Component
public class TestBeanPostProcessorNormal implements BeanPostProcessor, InitializingBean {

	@PostConstruct
	public void postConstruct(){
		log.debug("TestBeanPostProcessorNormal PostConstruct init");
	}

	@Autowired
	BeanPostProcessorService beanPostProcessorService;

	public TestBeanPostProcessorNormal(){
		log.debug("==TestBeanPostProcessorNormal create");
	}

	public void printfInfo(){
		log.debug("TestBeanPostProcessorNormal beanPostProcessorService[{}]",beanPostProcessorService);
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		log.debug("TestBeanPostProcessorNormal InitializingBean init");
	}
}

第二个类实现了BeanPostProcessor,并在后置方法中获取该bean,此时后置方法无法执行

@Component
public class TestBeanPostProcessorNormalUpdatePorperties implements BeanPostProcessor {

	public TestBeanPostProcessorNormalUpdatePorperties(){
		log.debug("==TestBeanPostProcessorNormalUpdatePorperties create");
	}

	@SneakyThrows
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{
		if(beanName.equals("a")) {
			Class<?> aClass = bean.getClass();
			Field[] fs = aClass.getDeclaredFields();
			for (Field f : fs) {
				if(f.getName().equals("str")){
					f.setAccessible(true);
					f.set(bean,"spring");
				}
			}
			return bean;
		}
		return null;
	}
}

此时发现第二个类的后置方法无法执行

3、现象三:在现象二的基础上,将类一的注入注释掉,此时第二个类的后置方法则可以获取到该bean

@Component
public class TestBeanPostProcessorNormal implements BeanPostProcessor, InitializingBean {

	@PostConstruct
	public void postConstruct(){
		log.debug("TestBeanPostProcessorNormal PostConstruct init");
	}

	//@Autowired
	//BeanPostProcessorService beanPostProcessorService;

	public TestBeanPostProcessorNormal(){
		log.debug("==TestBeanPostProcessorNormal create");
	}

	public void printfInfo(){
		log.debug("TestBeanPostProcessorNormal beanPostProcessorService[{}]",beanPostProcessorService);
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		log.debug("TestBeanPostProcessorNormal InitializingBean init");
	}
}

4、现象四:一个类实现了BeanPostProcessor和Ordered接口,此时@Autowired、@PostConstruct,InitializingBean都可以生效

但如果实现了BeanPostProcessor和PriorityOrdered,此时@Autowired、@PostConstruct无法生效,InitializingBean可以生效

5、现象5:一个类实现了BeanPostProcessor,或者实现了BeanPostProcessor+Ordered,

此时如果注入了一个bean,该bean是需要进行aop代理,此时会打印一个警告信息-------该bean是一个校验不合格的bean,也就是该bean没有执行完所有的BeanPostProcessor。

(我们知道bena的生命周期初始化前后会执行自己实现的BeanPostProcessor接口的前后置方法,而每个bean的生命周期可以执行多个BeanPostProcessor(spring容器中会有一个List存放所有BeanPostProcessor))

具体看:Bean生命周期和九次调用BeanPostProcessor都做了什么事情_bean的生命周期每个阶段都可以调用beanpostprocessor吗_小小程序猿ccc的博客-优快云博客

我们自己实现了的BeanPostProcessor只是在bean初始化前后调用,而其他spring中存在的BeanPostProcessor会在不同时期进行调用。

这里的警告就是该bean没有执行完所有的BeanPostProcessor,可能不是一个程序员想要的bean。

6、现象6:在现象5的基础上,实现了BeanPostProcessor+Ordered的类注入一个需要被aop代理的bean,此时不仅会打印警告信息,这个bean的aop还会失效

7、现象7:实现了BeanPostProcessor的类中注入需要aop代理的bean,此时该bean的aop不会失效

8:现象8:实现了BeanPostProcessor+PriorityOrdered的类注入需要aop代理的bean,此时该bean的aop不会失效。

==============================================

一、

registerBeanPostProcessors方法

refresh方法中,我们讲了invokeBeanFactoryPostProcessors方法(具体什么作用看前面的文章),现在我们要解释上面说得的哪些现象,需要看refresh方法里面的registerBeanPostProcessors方法:

顾名思义,这个方法的大概作用是注册BeanPostProcessors。

其实早在invokeBeanFactoryPostProcessors方法之前,

prepareBeanFactory就先添加了一个BeanPostProcessor:
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
		// Tell the internal bean factory to use the context's class loader etc.
		beanFactory.setBeanClassLoader(getClassLoader());
		beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
		beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

		//忽略掉部分类的注入
		// Configure the bean factory with context callbacks.
		//添加一个回调实现了ApplicationContextAwareaware的BeanPostProcessor
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
		beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
		beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
		beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
		beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

        //省略部分代码。。。。。。。。。。。。
        //添加一个处理事件的BeanPostProcessor
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
}

在bean生命周期的某步,就会去调用这个BeanPostProcessor进行回调aware接口:

 而spring用一个List来存储这些BeanPostProcessor。(spring自身或第三方的BeanPostProcessor都会放到这个list中)

在执行invokeBeanFactoryPostProcessors方法时,在执行ConfigurationClassPostProcessor的方法postProcessBeanFactory时,也添加了一个:

 这个BeanPostProcessor为了在加了@Confuration注解时,cglib会进行代理时使用的(可以去看前面的文章,这个就是给cglib代理时的创建的BeanFactory赋值的)

容器实例化时也会注册一些BeanPostProcessor:

容器构造方法--》AnnotatedBeanDefinitionReader构造方法--》

AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
//注册AutowiredAnnotationBeanPostProcessor,用来处理@Autowired注解
		if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
//将BeanPostProcessor转为BeanDefinition,然后put到BeanDefinitionMap中			
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		//注册CommonAnnotationBeanPostProcessor,用来处理@Resource注解+@Postcustrud注解
		// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
		if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		//注册了一个用来处理JPA的
		// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
		if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition();
			try {
				def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
						AnnotationConfigUtils.class.getClassLoader()));
			}
			catch (ClassNotFoundException ex) {
				throw new IllegalStateException(
						"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
			}
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

这里又注册了三个。

我们可以看看这个registerPostProcessor方法怎么注册的:

private static BeanDefinitionHolder registerPostProcessor(
			BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {

		definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		//注册这个BeanPostProcessor到BeanDefinitionMap中
		registry.registerBeanDefinition(beanName, definition);
		return new BeanDefinitionHolder(definition, beanName);
	}

(注意:注册和add不一样,注册是将BeanPostProcessor转化为BeanDefinition然后put到BeanDefinitionMap中,而我们上面讲的add是直接实例化后放进容器的List中)

注意:这个List<BeanPostProcessor> 的BeanPostProcessor对象来源主要有两个:

1)、spring中自己将BeanPostProcessor add进行(就是我们上面说的)

2)、通过getBean方法,将BeanDefinitionMap中的BeanPostProcessor类型的BeanDefinition实例化为Bean放进来(就是讲上面注册的BeanPostProcessor实例化为bean后放进来)

最后bean的生命周期中会去调用这个list中的BeanPostProcessor。

由于我们要演示上面的aop失效问题,所以会使用到@EnableAspectJAutoProxy开启aop

这里也会注册一个BeanPostProcessor

其他我们先不看了,这里的7个有3个进行了add到list中,却没有调用去调registerBeanPostProcessor方法进行注册。

此时的BeanDefinitionMap大概是由这么几个BeanPostProcessor(我们只讨论这7个,其他都不讨论)(由于我们这里没有JPA环境,所以第三个JPA相关的BeanPostProcessor也不存在,所以就只讨论6个)



所以在refresh-》 registerBeanPostProcessors(beanFactory);则是将容器中还没注册的BeanPostProcessor进行注册(即将List中的BeanPostProcessor进行注册)

此时我们开始进入registerBeanPostProcessors方法看是怎么进行注册的,注册流程是怎么样的?

入口:refresh--》registerBeanPostProcessors--》

PostProcessorRegistrationDelegate.registerBeanPostProcessors()

(注意:这个方法是将BeanDefinitionMap中的BeanPostProcessor实例化为bean并放进List<BeanPostProcessor>中去)

	public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

		//从BeanDefinitionMap中获取所有的BeanPostProcessor
		String[] 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.
		//beanProcessorTargetCount--->spring期望一个bean要执行几个BeanPostProcessor
		//beanFactory.getBeanPostProcessorCount()--->获取容器中List<BeanPostProcessor>的元素个数
		//beanProcessorTargetCount = list.size() + 1 + map.size()
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		//又往list中放进一个BeanPostProcessor(检查list中BeanPostProcessor的个数和预期的是否相等,上面的1就是指这个BeanPostProcessorChecker)
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

//省略部分代码。。。。。
}

这里可以看到,又往List中加入一个BeanPostProcessor,这个BeanPostProcessor很重要,可以解释我们,之前的一些现象。

我们进入这个BeanPostProcessorChecker:

	public BeanPostProcessorChecker(ConfigurableListableBeanFactory beanFactory, int beanPostProcessorTargetCount) {
			this.beanFactory = beanFactory;
			this.beanPostProcessorTargetCount = beanPostProcessorTargetCount;
		}

		@Override
		public Object postProcessBeforeInitialization(Object bean, String beanName) {
			return bean;
		}

		@Override
		public Object postProcessAfterInitialization(Object bean, String beanName) {
			//如果预期值和真实在List中的数量不一致则打印这个警告信息
			if (!(bean instanceof BeanPostProcessor) && !isInfrastructureBean(beanName) &&
					this.beanFactory.getBeanPostProcessorCount() < this.beanPostProcessorTargetCount) {
				if (logger.isInfoEnabled()) {
					logger.info("Bean '" + beanName + "' of type [" + bean.getClass().getName() +
							"] is not eligible for getting processed by all BeanPostProcessors " +
							"(for example: not eligible for auto-proxying)");
				}
			}
			return bean;
		}

可以看到这里在被调用时,会对预期值与真实的List中的进行对比,如果不同则打印警告信息。

我们现在开始解释下现象二:

第一个类中注入了一个普通bean,第二个类则无法调用到后置方法。

我们知道spring扫描的时候会将这两个类先放到BeanDefinitionMap中,所以在执行registerBeanPostProcessors方法时预期值为2+1(我们此时假设只有这两个类+List中的BeanPostProcessorChecker),我们知道refresh---》finishBeanFactoryInitialization中每个bean的生命周期都会去调用所有List中的BeanPostProcessor。

1)、此时第一个类的因为注入了一个普通bean-》BeanPostProcessorService ,bean的生命周期中需要先进行属性注入后才会初始化为bean,这样才能将其放进List<BeanPostProcessor>中,而此时因为注入了一个普通bean,所以需要先让BeanPostProcessorService 走完生命周期。

2)、BeanPostProcessorService 开始走他自己的生命周期,走到finishBeanFactoryInitialization中会去调用所有List中的BeanPostProcessor,此时就会调用到BeanPostProcessorChecker的后置方法,这是就开始检查预期值2+1是不是等于List中的数量,因为此时第一个类还在BeanDefinitionMap中,还卡在属性注入的过程,所以还没实例化成bean放进List中(此时的List中只有BeanPostProcessorChecker),所以导致打印警告信息+后续的BeanPostProcess的后置处方法不会执行。

总结下就是,本来普通bean BeanPostProcessorService的生命周期应该refresh-》finishBeanFactoryInitialization方法中完成的,可是因为被实现了BeanPostProcessor的类依赖(需要注入),导致其生命周期提前需要完成(在没完全完执行registerBeanPostProcessors方法(有些BeanPostProcessor还在Map中,还没被实例化为bean放进list中)就开始执行list中的所有BeanPostProcessor),所以会打印警告+有些BeanPostProcessor的后置方法无法执行

这里有个疑问,这里的第二个类TestBeanPostProcessorNormalUpdatePorperties,为什么不能先于第一个类实例化为bean,先放进list中?这样第一个类卡住的时候,BeanPostProcessorService走生命周期虽然还会打印警告,但不是还可以执行第二个类的后置处理方法?

---------------------------------------

第一现象:实现了BeanFactoryPostProcessor的类无法解析@Autowired、@PostConstruct,但可以执行InitializingBean接口的实现方法afterPropertiesSet。

我们在前面就提及,在执行registerBeanPostProcessors方法前(也是invokeBeanFactoryPostProcessors方法之前),解析@Autowired、@Postconstrct的BeanPostProcessor就已经被放到BeanDefinitionMap中了,但还没有实例化为Bean放进List中。而BeanFactoryPostProcessor被实例化为bean是在invokeBeanFactoryPostProcessors方法中就执行的,此时在走实现了BeanFactoryPostProcessor生命周期的时候,就不会执行到解析@Autowired、@Postconstrct的BeanPostProcessor,所以就导致了无法注入的效果(也就是实例化的时候解析@Autowired、@Postconstrct的BeanPostProcessor还没实例化为bean放进list中)

这里提个问题,为什么上面现象二的第一个类在实例化的时候就具备有了@Autowired的能力?

(因为解析@Autowired的BeanPostProcessor先于我们自定义的BeanPostProcessor被实例化,所以就有了@Autowired的能力)

--------------------------------------------------------

第三现象:即第二种现象不注入普通bean了,此时后置处理方法可以生效了

普通bean-》BeanPostProcessorService不被BeanPostProcessor依赖注入了,此时就会等到所以BeanPostProcessor都实例化完放进list才会进行自己的生命周期,所以就不会部分后置处理器无法执行的情况了。

--------------------------------------------------------------

现象四:一个类实现了BeanPostProcessor和Ordered接口,此时@Autowired、@PostConstruct,InitializingBean都可以生效

---因为解析@Autowired等的BeanPostProcessor先于我们自定义的BeanPostProcessor+实现了Ordered接口被实例化,所以就有了@Autowired等的能力

但如果实现了BeanPostProcessor和PriorityOrdered,此时@Autowired、@PostConstruct无法生效,InitializingBean可以生效

---因为解析@Autowired等的BeanPostProcessor慢于我们自定义的BeanPostProcessor+实现了PriorityOrdered接口被实例化,所以就无法具备@Autowired等的能力

现象四基本就是BeanPostProcessor实例化优先级的问题

-----------------------------------------------------------

现象五:一个类实现了BeanPostProcessor,或者实现了BeanPostProcessor+Ordered,

此时如果注入了一个bean,该bean是需要进行aop代理,此时会打印一个警告信息-------该bean是一个校验不合格的bean,也就是该bean没有执行完所有的BeanPostProcessor。

------aop对应的BeanPostProcessor实例化优先级低于实现了BeanPostProcessor+Ordered,所以就会打印警告

----------------------------------------------------------

6、现象6:实现了BeanPostProcessor+Ordered的类注入一个需要被aop代理的bean,此时不仅会打印警告信息,这个bean的aop还会失效

-----------原因和现象五一样,aop对应的BeanPostProcessor实例化优先级低于实现了BeanPostProcessor+Ordered,所以被注入的bean(进行了aop代理)就会出现在aop对应的beanPostProcessor没实例化时就执行生命周期的回调BeanPostProcessor流程,所以最好导致bean的aop失效的情况

------------------------------

7、现象7:实现了BeanPostProcessor的类中注入需要aop代理的bean,此时该bean的aop不会失效

-----aop对应的BeanPostProcessor实例化优先级快于没有实现Ordered的

-------------------------------

8:现象8:实现了BeanPostProcessor+PriorityOrdered的类注入需要aop代理的bean,此时该bean的aop不会失效。

-----aop对应的BeanPostProcessor实例化优先级快于实现PriorityOrdered的

所以我们可以总结下各个种类的BeanPostProcessor的实例化时机:

spring内置添加的》自定义的BeanPostProcessor+实现了PriorityOrdered接口》解析@Autowired等的BeanPostProcessor》自定义的BeanPostProcessor+实现了Ordered接口》aop对应的BeanPostProcessor》自定义的BeanPostProcessor

(其中解析@Autowired的又优先于解析@Resource、@Postconstrct的)

所以可以知道PriorityOrdered、Ordered可以提升BeanPostProcessor被实例化的优先级。我们从源码也可以看到:

	public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

		//从BeanDefinitionMap中获取所有的BeanPostProcessor
		String[] 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.
		//beanProcessorTargetCount--->spring期望一个bean要执行几个BeanPostProcessor
		//beanFactory.getBeanPostProcessorCount()--->获取容器中List<BeanPostProcessor>的元素个数
		//beanProcessorTargetCount = list.size() + 1 + map.size()
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		//又往list中放进一个BeanPostProcessor(检查list中BeanPostProcessor的个数和预期的是否相等,上面的1就是指这个BeanPostProcessorChecker)
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// Separate between BeanPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		//存放实现了priorityOrdered接口的BeanPostProcessor
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		//存放了内部的BeanPostProcessor
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		//存放实现了Ordered接口的BeanPostProcessor
		List<String> orderedPostProcessorNames = new ArrayList<>();
		//其他普通的BeanPostProcessor
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				//如果实现了priorityOrdered接口,则进行实例化为bean,
				// (这里不会调用CheckBeanPostProcessor,因为checkBeanPostProcessor只用于非BeanPostProcessor类型的bean
				//然后加入到priorityOrderedPostProcessors集合中
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				//如果实现了Ordered接口,先不进行实例化,放进orderedPostProcessorNames集合
				orderedPostProcessorNames.add(ppName);
			}
			else {
				//其他的也放进集合
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// First, register the BeanPostProcessors that implement PriorityOrdered.
		//注册实现了PriorityOrdered的BeanPostProcessors到容器的List<BeanPostProcessor>中去
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// Next, register the BeanPostProcessors that implement Ordered.
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String ppName : orderedPostProcessorNames) {
			//实例化实现了Ordered接口BeanPostProcessor
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		//注册实现了Ordered的BeanPostProcessors到容器的List<BeanPostProcessor>中去
		sortPostProcessors(orderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		// Now, register all regular BeanPostProcessors.
		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String ppName : nonOrderedPostProcessorNames) {
			//实例化其他普通的BeanPostProcessor
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			nonOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

		//注册到List中
		// Finally, re-register all internal BeanPostProcessors.
		sortPostProcessors(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).
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

aaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值