BeanPostProcessor使用
简介-摘录自网上
BeanPostProcessor是Spring中定义的一个接口,其与之前介绍的InitializingBean和DisposableBean接口类似,也是供Spring进行回调的。Spring将在初始化bean前后对BeanPostProcessor实现类进行回调,与InitializingBean和DisposableBean接口不同的是BeanPostProcessor接口将对所有的bean都起作用,即所有的bean初始化前后都会回调BeanPostProcessor实现类,而InitializingBean和DisposableBean接口是针对单个bean的,即只有在对应的bean实现了InitializingBean或DisposableBean接口才会对其进行回调。
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
使用说明
开发过程中,在实现一个自定义注解:
Component
@Slf4j
public class MyValueAspect implements BeanPostProcessor {
@Override public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
if(bean instanceof DemoService) {
Field[] fields = bean.getClass().getFields();
if(fields != null) {
for(Field field : fields) {
MyValue myValue = AnnotationUtils.findAnnotation(field,MyValue.class);
if(myValue != null) {
String name = myValue.name();
field.setAccessible(true);
try {
field.set(bean,name);
field.setAccessible(false);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
return bean;
}
理论上,这个时候容器中的bean会发生改变,如下图: 但是,实际在获取DemoService这个对应的属性aaa的时候,是空,如下是调试过程:
后面发现,demoService层做了aspect。也就是说,这个时候改变的是代理类的属性,没有改变本身父类的属性。去掉了aop后,一切正常。