0
点赞
收藏
分享

微信扫一扫

【Spring-IOC】通过BeanPostProcessor实现bean的定制化

醉倾城1 2022-02-06 阅读 40

BeanPostProcessor处理的是bean对象,也就是说已经完成了实例化。通过过该方法也只可以知道,我们可以定制bean的数据,例如重置值等。

public interface BeanPostProcessor {

	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

}

基于该接口还拓展了其他的接口,例如InstantiationAwareBeanPostProcessor是在实例化前后处理,或者重置属性值。

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

	default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}


	default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		return true;
	}



	default PropertyValues postProcessPropertyValues(
			PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {

		return pvs;
	}

}

下面看下是哪里处理的:
refresh方法的registerBeanPostProcessors。注意,在执行这个方法时,所有的beanDefinition已经完成了。这个方法主要时实例化处理器,并放入到处理器集合中。

	public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
		// 得到所有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.
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// Separate between BeanPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		// 区分出PriorityOrdered接口,Ordered接口,普通类型
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// 排序,依旧是在order值排序
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		// 添加到处理器集合中。
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// 实例化Ordered接口的.
		List<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);

		// 实例化普通类型的。
		List<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.
		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));
	}

这个和beanFactory处理器的逻辑一致。注意:这里只是实例化。真正调用的时候时在实例化bean的过程中。

这里有个需要注意的地方:
如果我们自定义bean处理器,其中依赖了以他的bean。实例化处理器之前要先实例其他的bean,可是如果有的bean处理器还有实例化完成,那么实例的bean就会应用不到处理器。
举个例子:定义处理器实现了PriorityOrdered,并且order最小。那么他就会最先实例化。如果依赖bean_A,beanA中用依赖出入了b,c使用了注解@autowired.那么将不生效。因为,此时,注入的bean处理器还有没有实例化呢,对Bean_A应用不到。所以,bean处理器尽量不要依赖自定义的bean.

在bean处理器实例化前,添加了一个处理器:

// 当前处理器的个数
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

这也是个bean处理器

private static final class BeanPostProcessorChecker implements BeanPostProcessor {
		public Object postProcessAfterInitialization(Object bean, String beanName) {
			// 对于自定义的bean,如果bean处理器还没有全部实例化,那么会提醒你:
			// 这个bean不能被所有的处理器处理。
			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;
		}
举报

相关推荐

0 条评论