Spring后处理器
概念
Spring的两种后处理器包括:
- Bean工厂后处理器,在BeanDefinitionMap填充完毕后,Bean实例化之前执行;
- Bean后处理器:在Bean实例化后,添加到singletonObjects走之前执行;
Spring的Bean工厂处理器
快速入门
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("beanDefinitionMap 填充完毕后回调postProcessBeanFactory");
// 修改某个BeanDefinition
// 获取BeanDefinitionMap红得到userService对象的Definition
BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("userService");
// 强行将这个beanDefinition修改为com.itheima.dao.impl.UserDaoImpl,在后面获取究竟会变成com.itheima.dao.impl.UserDaoImpl
beanDefinition.setBeanClassName("com.itheima.dao.impl.UserDaoImpl");
}
}
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过beanname进行获取 这里因为在Bean工厂后处理器中对Definition进行了强制修改,所以这边放回的是UserDaoImpl
Object userService = applicationContext.getBean("userService");
System.out.println(userService);
applicationContext.close();
}
通过后处理器注册BeanDefinition1
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("beanDefinitionMap 填充完毕后回调postProcessBeanFactory");
// 通过后处理器直接将类注册进Spring中
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("com.itheima.dao.impl.PersonDaoImple");
// 强转成DefaultListableBeanFactory, 其功能比ConfigurableListableBeanFactory更强大
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;
// 进行实际的注册
defaultListableBeanFactory.registerBeanDefinition("personDao", beanDefinition);
}
}
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过beanname进行获取
Object userService = applicationContext.getBean("personDao");
System.out.println(userService);
applicationContext.close();
}
通过后处理器注册BeanDefinition1
通过继承BeanDefinitionRefistryPostPorcesser更方便的实现后处理器注册BeanDefinition
public class BeanDefinitionRegistryPostProcessor implements org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor {
// 先执行
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
// 注册BeanDefinition
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("com.itheima.dao.impl.PersonDaoImple");
beanDefinitionRegistry.registerBeanDefinition("personDao", beanDefinition);
}
// 后执行
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
注解方式注册Bean
- 通过
@MyComponent
对需要进行注册的类进行标注 - 使用扫描工具找到所有带有标签的类
- 使用后处理器为每个类注册
Bean后处理器
Bean后处理器,是在Bean被实例化后存储到singletonObject单例池之前,会进行相应的处理,中间会经过Bean的初始化过程,例如属性填充,init等执行,其中一个就是Bean后处理器
快速入门
public class MyBeanPostProcessor implements BeanPostProcessor {
// 写了这个以后所有的Bean创建都会经过这个
// 先执行 在Bean实例化后的第一步,中间包括set方法、afterPropertiesSet、init方法
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof UserDaoImpl){
UserDaoImpl userDao = (UserDaoImpl) bean;
userDao.setUsername("123123123132");
}
System.out.println(beanName+":postProcessBeforeInitializaiton");
return bean;
}
// 后执行 在Bean实例化后的最后一步
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+":postProcessAfterInitialization");
return bean;
}
}
before和after执行的顺序
- postProcessBeforeInitialization
- Setxxx方法
- afterOrioertueSet方法
- init-method方法
- postProcessAfterInitialization方法