BeanPostProcessor
BeanPostProcessor是spring对外提供的bean的扩展机制,用于对bean进行扩展操作,常见的比如 AOP就是采用BeanPostProcessor接口实现的。
BeanPostProcessor接口
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName);
Object postProcessAfterInitialization(Object bean, String beanName);
}
实现类
@Component
public class ZhouyuBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("bean初始化前");
if(beanName.equals("userService")){
((UserServiceImpl)bean).setBeanName("周瑜好帅");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("bean初始化后");
//动态代理
if(beanName.equals("userService")){
Object proxyInstance = Proxy.newProxyInstance(ZhouyuBeanPostProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理逻辑");
return method.invoke(bean,args);
}
});
return proxyInstance;
}
return bean;
}
}
在BeanPostProcessor 的实现类上也加入了 @Component 注解,
在spring 启动过程中也会扫描到该BeanPostProcessor,与普通的Bean不同的是将BeanPostProcessor添加到一个List中,后续会在Bean的生命周期中使用到该BeanPostProcessor。
// 存放beanPostProcessor
private List<BeanPostProcessor> beanPostProcessorList = new ArrayList<>();
// 判断是否是BeanPostProcessor
if (BeanPostProcessor.class.isAssignableFrom(clazz)) {
BeanPostProcessor instance = (BeanPostProcessor) clazz.getDeclaredConstructor().newInstance();
beanPostProcessorList.add(instance);
}
...
// TODO beanPostProcessor也会走下面的逻辑,在spring中不是这么实现的
BeanPostProcessor.class.isAssignableFrom(clazz)
用于判断当前扫描到类的class是否实现了BeanPostProcessor接口,与instanceof关键字的区别如下:
一个是实例,一个是类对象
//父类.class.isAssignableFrom(子类.class)
//
//子类实例 instanceof 父类类型
在bean的生命周期中,在bean初始化前后调用beanPostProcessor的postProcessorBeforeInitialization方法,在bean初始化后调用beanPostProcessor的postProcessorAfterInitialization方法。
// 初始化前
for (BeanPostProcessor beanPostProcessor:beanPostProcessorList){
instance = beanPostProcessor.postProcessBeforeInitialization(instance,beanName);
}
// 初始化
if(instance instanceof InitializingBean){
((InitializingBean)instance).afterPropertiesSet();
}
// BeanPostProcessor
// 初始化后
for (BeanPostProcessor beanPostProcessor:beanPostProcessorList){
instance = beanPostProcessor.postProcessAfterInitialization(instance,beanName);
}