BeanPostProcessor
在 Spring 容器完成实例化、配置和初始化 bean 之后实现一些自定义的逻辑,比如对 bean 的处理,可以实现 org.springframework.beans.factory.config.BeanPostProcessor
这个接口,再根据实际业务重写 postProcessBeforeInitialization
和postProcessAfterInitialization
这两个方法或者其中一个方法。这个两个方法的参数,一个是 bean 的对象,一个是 bean 的名称。当需要多个 BeanPostProcessor 的时候,可以实现 order
接口来排序。
MyBean
直接用 spring 学习之 bean 生命周期的管理的例子。
MyConfig
@Configuration
public class MyConfig {
@Bean
public MyBeanPostProcessor myBeanPostProcessor() {return new MyBeanPostProcessor();
}
@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
public MyBean myBean() {return new MyBean("张三");
}
}
MyBeanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName + "初始化前调用");
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName + "初始化后调用");
return null;
}
}
测试代码
@Test
public void test(){ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
System.out.println("开始销毁");
((AnnotationConfigApplicationContext) app).close();}
可以看出,在调用 afterPropertiesSet、initMethod 方法前,调用了 postProcessBeforeInitialization 方法,postConstruct 这个没有被调用。这两个调用结束后,再调用 postProcessAfterInitialization 方法。
BeanFactoryPostProcessor
BeanPostProcessor 是在对 bean 的处理,那对元数据的操纵呢,可以通过实现 org.springframework.beans.factory.config.BeanFactoryPostProcessor
的接口来实现,然后实现 postProcessBeanFactory
方法,这个方法要传递的参数是 configurableListableBeanFactory,他继承了 BeanFactory,可以对 bean 进行一些额外的操作。与 BeanPostProcessor 一样,如果有多个的话,可以通过 order 接口来指定执行的顺序。
MyBeanFactoryPostProcessor
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {Iterator<String> beanNamesIterator = configurableListableBeanFactory.getBeanNamesIterator();
while (beanNamesIterator.hasNext()) {System.out.println("postProcessBeanFactory:" + beanNamesIterator.next());
}
}
}
MyConfig 在上面的基础上加入了 MyBeanFactoryPostProcessor 的注入。
测试代码同上,运行结果如下: