六、Spring后处理器
- Spring的后处理器是Spring对外开放的重要扩展点,允许我们介入到Bean的实例化流程中,以达到动态注册BeanDefinition,动态修改BeanDefinition,以及修改Bean的作用,主要有两种后处理器:
- BeanFactoryPostProcessor:Bean工厂后处理器,在BeanDefinitionMap填充完毕,Bean实例化之前执行;
- BeanPostProcessor:Bean后处理器,一般在Bean实例化后,填充到单例池singletonObjects之前执行;
6.1 工厂后处理器 BeanFactoryPostProcessor
6.1.1 修改BeanDefinition
public class MyBeanFactoryProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 修改beanDefinition
BeanDefinition userService = beanFactory.getBeanDefinition("userService");
userService.setBeanClassName("xxx.UserDaoImpl");
}
}
@Test
public void test() {
// 创建ApplicationContext,加载xml文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取bean
Object userService = applicationContext.getBean("userService");
System.out.println(userService);
}
<bean id = "userDao" class = "xxx.UserDaoImpl"></bean>
<bean id="userService" class="xxx.UserServiceImpl"></bean>
<!-- bean 后工厂处理 -->
<bean class="xxx.MyBeanFactoryProcessor"></bean>
getBean之前:
getBean之后:
6.1.2 注册BeanDefinition
<!-- 没有bean实例 -->
<bean class="xxx.MyBeanFactoryProcessor"></bean>
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 注册beanDefinition
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("xxx.UserServiceImpl");
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
// beanName beanDefinition
defaultListableBeanFactory.registerBeanDefinition("userService", beanDefinition);
}
6.1.3 BeanDefinitionRegistryPostProcessor
- 是BeanFactoryPostProcessor的子接口,专门用来注册BeanDefinition
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
// 注册beanDefinition
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("xxx.UserServiceImpl");
beanDefinitionRegistry.registerBeanDefinition("userService1", beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
<bean class="xxx.MyBeanDefinitionRegistryPostProcessor"></bean>
6.2 Bean后处理器 BeanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* 实例化、依赖注入完毕,在调用显示的初始化之前完成一些定制的初始化任务
* 方法返回值不能为null,返回null表示后处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中
* 如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization-----before")
return bean;
}
/**
* 实例化、依赖注入、初始化完毕时执行
* 方法返回值不能为null,返回null表示后处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中
* 如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization-----after")
return bean;
}
}
public class User {
private String name;
public User(){System.out.println("User 被实例化");}
// 自定义的初始化方法
public void start(){System.out.println("User 中自定义的初始化方法");}
}
<bean class="xxx.User" id="user" init-method="start">
<property name="name" value="迪迦奥特曼" />
</bean>
<!-- 注册处理器 -->
<bean class="xxx.MyBeanPostProcessor"></bean>
执行结果:
User 被实例化
迪迦奥特曼
postProcessBeforeInitialization-----before
User 中自定义的初始化方法
postProcessAfterInitialization-----after
执行顺序:
Bean实例化 -> Bean属性注入 -> postProcessBeforeInitialization -> init-method(自定义初始化方法) -> postProcessAfterInitialization