BeanPostProcessor 接口作用是:
如果我们需要在 Spring 容器完成 Bean 的实例化、配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个 BeanPostProcessor 接口的实现,然后注册到容器中
BeanPostProcessor 接口有两个方法需要实现:postProcessBeforeInitialization 和 postProcessAfterInitialization, 前者在实例化及依赖注入完成后、在任何初始化代码(比如配置文件中的 init-method)调用之前调用;后者在初始化代码调用之后调用。
注意:
1、接口中的两个方法都要将传入的 bean 返回,而不能返回 null,如果返回的是 null 那么我们通过 getBean 方法将得不到目标。
public class StepHandlerBeanPostProcessor implements BeanPostProcessor { private StepWorkerHolder stepWorkerHolder; public StepHandlerBeanPostProcessor(StepWorkerHolder stepWorkerHolder) { this.stepWorkerHolder = stepWorkerHolder; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { processStepHandlerAnnotation(bean); return bean; } private void processStepHandlerAnnotation(Object bean) { final Class beanClass = AopProxyUtils.ultimateTargetClass(bean); StepHandler stepHandlerAnnotation = beanClass.getAnnotation(StepHandler.class); if (stepHandlerAnnotation == null) { return; } // 记录stepWorker,这样就可以把包含注解StepHandler的bean都存到缓存里面 stepWorkerHolder.putStepWorker(stepHandlerAnnotation.value(), (StepWorker) bean); } } @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface StepHandler { String value(); }
BeanFactoryPostProcessor 可以修改 BEAN 的配置信息而 BeanPostProcessor 不能
BeanFactoryPostProcessor 的回调比 BeanPostProcessor 要早,还有就是 BeanFactoryPostProcessor 确实有能力改变初始化 BEAN 的内容
package com.springdemo.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;
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
// TODO Auto-generated method stub
//BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能
//我们在这里修改postProcessorBean的username注入属性
BeanDefinition bd = beanFactory.getBeanDefinition("postProcessorBean");
MutablePropertyValues pv = bd.getPropertyValues();
if(pv.contains("username"))
{
pv.addPropertyValue("username", "xiaojun");
}
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于