Spring的后置处理器
Spring的后置处理器介绍
Spring的后置处理器是Spring对外开发的重要扩展点,允许我们介入到Bean的整个实例化流程中来,以达到动态注册 。BeanDefinition,动态修改BeanDefinition,以及动态修改Bean的作用。Spring主要有两种后处理器:
- BeanFactoryPostProcessor:Bean工厂后处理器,在BeanDefinitionMap填充完毕,Bean实例化之前执行; (
只执行一次
;执行时机:BeanDefinitionMap填充完毕后
) - BeanPostProcessor:Bean后处理器,一般在Bean实例化之后,填充到单例池singletonObjects之前执行(
可执行多次
;执行时机:每个Bean实例化之后
)
一、Bean工厂后置处理器
1.1 BeanFactoryPostProcessor
BeanFactoryPostProcessor是一个接口规范,实现了该接口的类只要交由Spring容器管理的话,那么Spring就会回 调该接口的方法,用于对BeanDefinition注册和修改的功能
执行时机: BeanDefinitionMap填充完毕后,在bean调用构造函数,init方法,bean后处理器执行之前执行
方法作用: 主要用来对bean定义做一些改变
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("beanDefinitionMap填充完后回调该方法");
// 注册BeanDefinition
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("com.it.service.impl.UserServiceImpl");
// 强转成DefaultListableBeanFactory
// 装换为子类,因为父类没有添加beanDefinition对象的api
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
// 注册到beanDefinitionMap里
defaultListableBeanFactory.registerBeanDefinition("userService",beanDefinition);
}
}
1.2 BeanDefinitionRegistryPostProcessor
Spring 提供了一个BeanFactoryPostProcessor的子接口BeanDefinitionRegistryPostProcessor专门用于注册 BeanDefinition操作
执行时机: 在bean调用构造函数,init方法,bean后处理器执行,BeanFactoryPostProcessor-bean工厂后置处理器之前执行
方法作用: 用来注册更多的bean到spring容器
@Component
public class MyBeanFactoryPostProcessor2 implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("com.it.service.impl.UserServiceImpl");
beanDefinitionRegistry.registerBeanDefinition("userService",beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
二、Bean后置处理器
2.1 BeanPostProcessor
Bean被实例化后,到最终缓存到名为singletonObjects单例池之前,中间会经过Bean的初始化过程,例如:属性的 填充、初始方法init的执行等,其中有一个对外进行扩展的点BeanPostProcessor,我们称为Bean后处理。跟上面的 Bean工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的BeanPostProcessor,会在流程节点上被 Spring自动调用。
执行时机: Bean被实例化后,到最终缓存到名为singletonObjects单例池之前
作用: 在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。
UserDao
public class UserDao implements InitializingBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public UserDao() {
System.out.println("userDao对象创建");
}
public void init(){
System.out.println("init初始化方法执行");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("属性设置之后执行....");
}
}
MyBeanPostProcessor
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+": postProcessBeforeInitialization");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + ": postProcessAfterInitialization");
return bean;
}
}