在Spring容器完成实例化、配置和初始化bean以后实现一些自定义的逻辑,好比对bean的处理,能够实现org.springframework.beans.factory.config.BeanPostProcessor
这个接口,再根据实际业务重写postProcessBeforeInitialization
和postProcessAfterInitialization
这两个方法或者其中一个方法。这个两个方法的参数,一个是bean的对象,一个是bean的名称。当须要多个BeanPostProcessor的时候,能够实现order
接口来排序。
MyBean
直接用spring学习之bean生命周期的管理的例子。
MyConfigspring
@Configuration public class MyConfig { @Bean public MyBeanPostProcessor myBeanPostProcessor() { return new MyBeanPostProcessor(); } @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod") public MyBean myBean() { return new MyBean("张三"); } }
MyBeanPostProcessorsegmentfault
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; } }
测试代码app
@Test public void test(){ ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class); System.out.println("开始销毁"); ((AnnotationConfigApplicationContext) app).close(); }
能够看出,在调用afterPropertiesSet、initMethod方法前,调用了postProcessBeforeInitialization方法,postConstruct这个没有被调用。这两个调用结束后,再调用postProcessAfterInitialization方法。ide
BeanPostProcessor是在对bean的处理,那对元数据的操纵呢,能够经过实现org.springframework.beans.factory.config.BeanFactoryPostProcessor
的接口来实现,而后实现postProcessBeanFactory
方法,这个方法要传递的参数是configurableListableBeanFactory,他继承了BeanFactory,能够对bean进行一些额外的操做。与BeanPostProcessor同样,若是有多个的话,能够经过order接口来指定执行的顺序。
MyBeanFactoryPostProcessorpost
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的注入。
测试代码同上,运行结果以下:学习