spring中的BeanPostProcessor

r囧r小猫 2022-05-16 09:07 262阅读 0赞
  1. /**
  2. * 实现BeanPostProcessor的类常用功能都有哪些
  3. * InitDestroyAnnotationBeanPostProcessor:init和destroy方法的后处理,包括@PostConstruct和@PreDestroy注解
  4. * AutowiredAnnotationBeanPostProcessor:处理含有@Autowired注解的参数注入
  5. * ApplicationContextAwareProcessor:处理postProcessBeforeInitialization方法
  6. * AsyncAnnotationBeanPostProcessor:处理@Async注解
  7. * BeanValidationPostProcessor:参数校验
  8. *
  9. */

类实现BeanPostProcessor接口,并重写postProcessBeforeInitialization和postProcessAfterInitialization方法,将类注册到IOC容器中,这两个方法会在每一个组建被创建时都被调用

  1. postProcessBeforeInitialization:在构造方法之后,初始化方法执行之前被调用
  2. postProcessAfterInitialization:在初始化方法执行之后被调用

下面是具体的代码

  1. import org.springframework.beans.BeansException;
  2. import org.springframework.beans.factory.config.BeanPostProcessor;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class MyBeanPostProcessor implements BeanPostProcessor {
  6. //bean是当前组建,beanName是当前组建在容器中的id
  7. @Override
  8. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  9. System.out.println("postProcessBeforeInitialization->" + bean + "->" + beanName);
  10. return bean;
  11. }
  12. @Override
  13. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  14. System.out.println("postProcessAfterInitialization->" + bean + "->" + beanName);
  15. return bean;
  16. }
  17. }

当这个容器被注册到容器中时,方法被调用的顺序如下面

Construct->postProcessBeforeInitialization->Init->postProcessAfterInitialization->Destroy

原理:

下面是源码中调用方法的顺序:

  1. /**
  2. * populateBean(实例化bean并为其赋值)
  3. * {
  4. * applyBeanPostProcessorsBeforeInitialization
  5. * invokeInitMethods(反射调用初始化方法)
  6. * applyBeanPostProcessorsAfterInitialization
  7. * }
  8. */

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读