LifecycleBeanPostProcessor的作用

骑猪看日落 2021-12-19 14:37 241阅读 0赞

LifecycleBeanPostProcessor的作用

  • 概述:LifecycleBeanPostProcessor和DefaultAdvisorAutoProxyCreator
    • DefaultAdvisorAutoProxyCreator
    • BeanPostProcessor
    • LifecycleBeanPostProcessor
    • 总结

概述:LifecycleBeanPostProcessor和DefaultAdvisorAutoProxyCreator

在Spring和Shiro进行整合时,配置某些bean的时候都需要配置LifecycleBeanPostProcessor。有一次在使用@RequiresPermissions注解的时候配置了一个AuthorizationAttributeSourceAdvisor然后用到了这两个类,就仔细研究了一下。基本配置如下:

  1. <bean id="beanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
  2. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="beanPostProcessor"/>

DefaultAdvisorAutoProxyCreator

DefaultAdvisorAutoProxyCreator 实现了 BeanProcessor(利用反射实例化对象,完成bean 的实例化)接口,ApplicationContext 读取完所有的Bean 配置信息后,这个类扫描上下文寻找所有的 Advisor(一个切入点和一个通知的组成)然后把这些 Advisor 应用到所有符合切入点的 Bean中。 其中 depend-on 就指定了实现哪个 BeanProcessor 接口。因此需要还需要配置一个实现BeanPostProcessor接口的类。

BeanPostProcessor

首先来看 BeanPostProcessor:
BeanPostProcessor在 Spring 完成 Bean 的实例化、配置和其他初始化之后,如果想要添加一些自定义的逻辑处理(因此BeanPostProcessor也称为Bean后置处理器) 就需要实现一个或者多个 BeanPostProcessor 接口,注册到Spring容器中。
实现 BeanPostProcessor 主要是两个方法:
postProcessBeforeInitializationpostProcessAfterInitialization

  1. public interface BeanPostProcessor {
  2. @Nullable
  3. //bean初始化之前进行处理
  4. default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  5. return bean;
  6. }
  7. @Nullable
  8. //bean初始化之后进行处理
  9. default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  10. return bean;
  11. }
  12. }

LifecycleBeanPostProcessor

LifecycleBeanPostProcessor 实现了 BeanPostProcessor 接口。在 LifecycleBeanPostProcessor 类中实现了 DestructionAwareBeanPostProcessor,因此除了上述两个方法之外还多了一个 postProcessBeforeDestruction 方法,表示在bean销毁之前进行某种处理。

DestructionAwareBeanPostProcessor:

  1. public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {
  2. void postProcessBeforeDestruction(Object var1, String var2) throws BeansException;
  3. default boolean requiresDestruction(Object bean) {
  4. return true;
  5. }
  6. }

LifecycleBeanPostProcessor :

  1. public class LifecycleBeanPostProcessor implements DestructionAwareBeanPostProcessor, PriorityOrdered {
  2. //......一些属性和构造器
  3. public Object postProcessBeforeInitialization(Object object, String name) throws BeansException {
  4. if (object instanceof Initializable) {
  5. try {
  6. if (log.isDebugEnabled()) {
  7. log.debug("Initializing bean [" + name + "]...");
  8. }
  9. ((Initializable)object).init();
  10. } catch (Exception var4) {
  11. throw new FatalBeanException("Error initializing bean [" + name + "]", var4);
  12. }
  13. }
  14. return object;
  15. }
  16. public Object postProcessAfterInitialization(Object object, String name) throws BeansException {
  17. return object;
  18. }
  19. public void postProcessBeforeDestruction(Object object, String name) throws BeansException {
  20. if (object instanceof Destroyable) {
  21. try {
  22. if (log.isDebugEnabled()) {
  23. log.debug("Destroying bean [" + name + "]...");
  24. }
  25. ((Destroyable)object).destroy();
  26. } catch (Exception var4) {
  27. throw new FatalBeanException("Error destroying bean [" + name + "]", var4);
  28. }
  29. }
  30. }
  31. 。。。。。。省略
  32. }

总结

可见 LifecycleBeanPostProcessor 就是通过上述三个方法对Initializable和Destroyable这两个类的init方法和destroy方法进行内部调用来实现bean 的生命周期控制

发表评论

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

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

相关阅读

    相关 Hashcode作用

    关于Hashcode的作用     总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者

    相关 flush()作用

    flush() 是把缓冲区的数据强行输出, 主要用在IO中,即清空缓冲区数据,一般在读写流(stream)的时候, 数据是先被读到了内存中,再把数据写到文件中,

    相关 extern作用

    用 \include 可以包含其他头文件中变量、函数的声明,为什么还要 extern 关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含 \include<