**
Spring后处理器-BeanPostProcessor
**
Bean被实例化后,到最终缓存到singletonObjects单例池之前,中间会经常Bean的初始化过程,例如:属性的填充、初使方法init的执行等,其中有一个对外进行扩展的点BeanPostProcessor,我们称为Bean后处理。跟Bean工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的BeanPostProcessor,会在流程节点上被Spring自动调用。
步骤如下:
1.准备好一个接口实现类
public class UserDaoImpl implements UserDao {
private String username;
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public UserDaoImpl(){
System.out.println("userDao实例化");
}
}
2.配置
<bean id="userDao" name="aaa,bbb" class="com.itheima.dao.impl.UserDaoImpl"></bean>
3.定义一个类实现接口BeanPostProcessor及其方法
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof UserDaoImpl){
UserDaoImpl userDao= (UserDaoImpl) bean;
userDao.setUsername("哈哈");
}
System.out.println(beanName+":postProcessBeforeInitialization");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+":postProcessAfterInitialization");
return bean;
}
}
4.配置实现接口的类
<bean class="com.itheima.processor.MyBeanPostProcessor"/>
5.测试
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDaoImpl userDao = (UserDaoImpl) applicationContext.getBean("userDao");
System.out.println(userDao.getUsername());
打印结果如下:
InitializingBean接口的使用与bean的生命周期
6.改进UserDaoImpl类,增加实现InitializingBean接口
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("属性设置之后执行");
}
7.UserDaoImpl类增加init的初始化方法
public void init(){
System.out.println("init初始化方法执行");
}
8.配置文件指定初始化方法
<bean id="userDao" name="aaa,bbb" class="com.itheima.dao.impl.UserDaoImpl" init-method="init"></bean>
9.测试
main方法中代码不变直接运行,打印如下,可知接口的方法其运行顺序先于配置的初始化方法