Spring 源码个人浅浅分析(7)--- BeanFactoryPostProcessor

BeanFactoryPostProcessor是在bean实例化前,可以对其bean的操作,和BeanPostProcessor类似,可以对bean的定义(配置元数据)进行处理,并且可以配置多个BeanFactoryPostProcessor,可以通过设置“order”属性来控制BeanFactoryPostProcessor的执行次序(仅当BeanFactoryPostProcessor实现了Order接口时才可以设置此属性,因此在使用BeanFactoryPostProcessor的时候,就应该考虑实现Order接口)

如果想改变实际的bean实例,(例如从配置元数据创建的对象),最好使用BeanFactoryPostProcessor。其作用域范围是容器级的,只和你所使用的容器有关。如果在容器定义一个BeanFactoryPostProcessor,他仅仅对此容器的bean进行h后置处理。BeanFactoryPostProcessor不会对定义在另一个容器中的bean进行后置处理,即使这两个容器都是在同一个层次上。

在spring中存在对于BeanFactoryPostProcessor的典型应用,比如PropertyPlaceholderConfigurer

以下是BeanFactoryPostProcessor的demo

package springSourseAnalyes;

import java.util.List;

import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionVisitor;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.TypedStringValue;
import org.springframework.util.StringValueResolver;

public class BeanFactoryPostProcessDemo implements BeanFactoryPostProcessor{

	@Override
	public void postProcessBeanFactory(
			ConfigurableListableBeanFactory beanFactory) throws BeansException {
		/**
		 * 可以在任何bean实例化之前都能获取bean 的信息,可以任意修改
		 */
		String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
		
		for(String beanString:beanDefinitionNames){
			BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanString);
			MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();  //获取实例的属性,以及属性值
			System.out.println("propertyValues--->"+propertyValues);
			StringValueResolver valueResolver = null;
//			if(propertyValues.contains("nameString")){//判断某个类如果有name属性的
//				propertyValues.addPropertyValue("name","崔春驰");//修改属性值
//				System.out.println("修改了属性值");
//			}
			/**
			 * 两种方式: 1、使用MutablePropertyValues属性类,直接修改指定的属性值,不需要指定对象BeanDefinitionVisitor
			 * 		    2、使用StringValueResolver接口来将获取的属性值作修改 ,,并且需要指定BeanDefinitionVisitor
			 */
			if(!propertyValues.isEmpty() ){  //如果包含某个属性,
				List<PropertyValue> propertyValueList = propertyValues.getPropertyValueList();
				System.out.println("属性:"+propertyValueList.toString());
				for(PropertyValue propertyValue : propertyValueList){
					System.out.println("propertyValue---->"+propertyValue.getName());
					if("nameString".equals(propertyValue.getName())){
						TypedStringValue value1 = (TypedStringValue) propertyValue.getValue();
						String value = value1.getValue();
						/**
						 * 从源码AbstractAutowireCapableBeanFactory  的方法applyPropertyValues看的出填充数据的逻辑代码
						 */
						//优先这种方式重写copy
						propertyValues.addPropertyValue("nameString", value != null ? value.substring(0, 1).concat("****"):"");
						//后执行这个,
						propertyValue.setConvertedValue("weqwew");
					}
				}
				//获取属性值
				valueResolver = new StringValueResolver() {
					@Override
					public String resolveStringValue(String strVal) {
							System.out.println("StringValueResolver接口------值:"+strVal);
							if("崔春驰".equals(strVal)) return strVal.substring(0,1).concat("&&&&&");
							return strVal;
					}
				};
			}else{
				valueResolver = new StringValueResolver() {
					
					@Override
					public String resolveStringValue(String strVal) {
						// TODO Auto-generated method stub
						return strVal;
					}
				};
			}
			BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(valueResolver );
			visitor.visitBeanDefinition(beanDefinition);
		}
		
	}

}

下面深入研究BeanFactoryPostProcessor

方法invokeBeanFactoryPostProcessors为激活BeanFactoryPostProcessor

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		// Invoke BeanDefinitionRegistryPostProcessors first, if any.
		Set<String> processedBeans = new HashSet<String>();
        //对BeanDefinitionRegistry类型的处理
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();
			List<BeanDefinitionRegistryPostProcessor> registryPostProcessors =
					new LinkedList<BeanDefinitionRegistryPostProcessor>();
            //硬编码注册的后处理器
			for (BeanFactoryPostProcessor postProcessor : getBeanFactoryPostProcessors()) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryPostProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
                    //对于BeanDefinitionRegistryPostProcessor类型,在
                    //BeanFactoryPostProcessor的基础上还有自己定义的的方法,需要先调用
					registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
					registryPostProcessors.add(registryPostProcessor);
				}
				else {
                    //记录常规BeanFactoryPostProcessor
					regularPostProcessors.add(postProcessor);
				}
			}
            //配置注册的后处理器
			Map<String, BeanDefinitionRegistryPostProcessor> beanMap =
					beanFactory.getBeansOfType(BeanDefinitionRegistryPostProcessor.class, true, false);
			List<BeanDefinitionRegistryPostProcessor> registryPostProcessorBeans =
					new ArrayList<BeanDefinitionRegistryPostProcessor>(beanMap.values());
			OrderComparator.sort(registryPostProcessorBeans);
			for (BeanDefinitionRegistryPostProcessor postProcessor : registryPostProcessorBeans) {

                //BeanDefinitionRegistryPostProcessor的特殊处理
				postProcessor.postProcessBeanDefinitionRegistry(registry);
			}
            //激活postProcessorBeanFactory方法,之前激活的是
            //postprocessorBeanfinitionRegistry,硬编码设置的
            //BeanDefinitionRegistryPostProcessor
			invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
            //配置的BeanDefinitionRegistryPostProcessor
			invokeBeanFactoryPostProcessors(registryPostProcessorBeans, beanFactory);
            //常规BeanFactoryPostProcessor
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
			processedBeans.addAll(beanMap.keySet());
		}
		else {
			// Invoke factory processors registered with the context instance.
			invokeBeanFactoryPostProcessors(getBeanFactoryPostProcessors(), beanFactory);
		}

		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let the bean factory post-processors apply to them!
        //对于配置中读取的BeanFactoryPostProcessor的处理,自己在xml中定义的,实现
        //BeanFactoryPostProcessor接口的
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
		List<String> orderedPostProcessorNames = new ArrayList<String>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
        //对后处理器进行分类
		for (String ppName : postProcessorNames) {
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
                //已经处理过的,
			}
			else if (isTypeMatch(ppName, PriorityOrdered.class)) {
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
        //按照优先级进行排序
		OrderComparator.sort(priorityOrderedPostProcessors);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
        //按照order排序
		OrderComparator.sort(orderedPostProcessors);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// Finally, invoke all other BeanFactoryPostProcessors.
        //无序,去执行调用 实现BeanFactoryPostProcessor的接口的实现类。
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
	}

对于BeanFactoryPostProcessor的处理主要分为两种:

1:对于BeanDefinitionRegistry类的特殊处理。

2:对普通的BeanFactoryPostProcessor进行处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值