水稻:这两天看了BeanDefinition和BeanFactoryPostProcessor还有BeanPostProcessor的源码。要不要了解一下
菜瓜:six six six,大佬请讲
水稻:上次我们说SpringIOC容器是一个典型的工厂模式
菜瓜:sodasinei,BeanDefinition我了解了。它是创建bean的模板,类似于java创建对象依赖的class一样。那还有两个很长的单词是啥呢?
水稻:忽略掉后面老长的后缀,我们看BeanFactory和Bean是不是很亲切。PostProcessor被翻译成后置处理器,暂且我们把它看成是处理器就行
菜瓜:有了模糊的概念,不明觉厉
水稻:来,看demo
package com.vip.qc.postprocessor; import org.springframework.beans.BeansException; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.stereotype.Component; /** * 获取初始化好的BeanFactory,此时还未进行bean的实例化 * * @author QuCheng on 2020/6/14. */ @Component public class BeanFactoryPostProcessorT implements BeanFactoryPostProcessor { public static final String BEAN_NAME = "processorT"; @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { BeanDefinition initializingBeanT = beanFactory.getBeanDefinition(BEAN_NAME); MutablePropertyValues propertyValues = initializingBeanT.getPropertyValues(); String pName = "a"; System.out.println("BeanFactoryPostProcessor a " + propertyValues.getPropertyValue(pName) + " -> 1"); propertyValues.addPropertyValue(pName, "1"); } } package com.vip.qc.postprocessor; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; /** * @author QuCheng on 2020/6/14. */ @Component public class BeanPostProcessorT implements BeanPostProcessor { public static final String beanNameT = "processorT"; @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (beanNameT.equals(beanName)) { ProcessorT processorT = ((ProcessorT) bean); System.out.println("BeanPostProcessor BeforeInitialization a:" + processorT.getA() + "-> 3"); processorT.setA("3"); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (beanNameT.equals(beanName)){ ProcessorT processorT = ((ProcessorT) bean); System.out.println("BeanPostProcessor AfterInitialization a:" + processorT.getA() + "-> 4"); processorT.setA("4"); } return bean; } } package com.vip.qc.postprocessor; import org.springframework.stereotype.Component; /** * @author QuCheng on 2020/6/14. */ @Component public class ProcessorT { public ProcessorT() { System.out.println("ProcessorT 无参构造 a:" + a + "-> 2" ); a = "2"; } private String a; public String getA() { return a; } public void setA(String a) { this.a = a; } @Override public String toString() { return "ProcessorT{" + "a=‘" + a + ‘\‘‘ + ‘}‘; } } // 测试类 @Test public void test() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.vip.qc.postprocessor"); ProcessorT processorT = (ProcessorT) context.getBean("processorT"); System.out.println(processorT); } // 结果 BeanFactoryPostProcessor a null -> 1 ProcessorT 无参构造 a:null-> 2 BeanPostProcessor BeforeInitialization a:1-> 3 BeanPostProcessor AfterInitialization a:3-> 4 ProcessorT{a=‘4‘}
BeanFactoryPostProcessor在对象还未初始化前可以拿到对象的BeanDefinition对其设置属性值
菜瓜:好像看懂了。BeanFactoryPostProcessor可以拿到BeanFactory对象,获取里面所有的BeanDefinition并可对其进行干预。BeanPostProcessor其实是在bean已经被创建完成之后进行加工操作
水稻:没错。这是我们自己进行干预的demo。限于篇幅有限,你可以去看一下Spring自己对于这两个接口的实现源码。比较重要的推荐下面几个
菜瓜:你放心,我不会看的。这么复杂的东西,听着都费劲
水稻:不愧是你!没事,有机会聊bean的生命周期的时候咱们还会说到这些东西。到时候再刷一遍
Spring:BeanDefinition&PostProcessor不了解一下吗?
原文:https://www.cnblogs.com/nightOfStreet/p/13138046.html