BeanPostProcessor接口定义了两个方法,分别在bean被容器加载实例化后,指定的init方法执行前后执行。
BeanPostProcessor接口在spring5中定义如下
方法 | 作用 |
postProcessBeforeInitialization | 在init方法之前执行 |
postProcessAfterInitialization | 在init方法之后执行 |
验证代码如下:
public class Component {
public Component() {
System.out.println("component的构造方法");
}
public void init() {
System.out.println("component的init方法");
}
}
@Configuration
@ComponentScan
public class MyConfig {
@Bean(initMethod = "init")
public Component component() {
return new Component();
}
}
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "的后置处理器before");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "的后置处理器after");
return bean;
}
}
public class TestMyBeanPostProcessor {
@Test
public void test() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
}
}
输出如下:
component的构造方法
component的后置处理器before
component的init方法
component的后置处理器after
当有多个类实现了BeanPostProcessor时,可以同时实现Orderd接口并重写getOrder方法,设置执行顺序,数字越小越先执行。
@Component
public class MyBeanPostProcessorA implements BeanPostProcessor, Ordered {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "的后置处理器before -------A");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "的后置处理器after --------A");
return bean;
}
@Override
public int getOrder() {
return 0;
}
}
@Component
public class MyBeanPostProcessorB implements BeanPostProcessor, Ordered {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "的后置处理器before -------B");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "的后置处理器after --------B");
return bean;
}
@Override
public int getOrder() {
return 1;
}
}
执行结果如下:
component的构造方法
component的后置处理器before -------A
component的后置处理器before -------B
component的init方法
component的后置处理器after --------A
component的后置处理器after --------B