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");
}
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于