美文网首页
Spring BeanPostProcessor 整理

Spring BeanPostProcessor 整理

作者: 牧羊人刘俏 | 来源:发表于2021-01-06 16:03 被阅读0次

    BeanPostProcessor

    其两个方法
    1 postProcessBeforeInitialization
    在bean的构造方法执行完,且其属性已经被填充,还没有执行afterPropertiesSet(如果有)和init-method(如果有)之前,被spring回调来执行。

    2 postProcessAfterInitialization
    在bean的afterPropertiesSet(如果有)和init-method(如果有)执行完之后,被spring回调执行。
    但是要注意如果FactoryBean,那么在getObject方法产生bean的时候,这个方法会被调用两次,一次是生成FactoryBean的时候,在一个就是getObject的时候。可以通过bean instanceof FactoryBean方法来自定义是否要执行两次。

    如果某个BeanPostProcessor的postProcessAfterInitialization方法返回的bean为null,那么后续的BeanPostProcessor的postProcessAfterInitialization不会继续的执行。

    InstantiationAwareBeanPostProcessor

    继承于BeanPostProcessor,此类一般spring内部使用
    1 postProcessBeforeInstantiation
    在bean调用构造函数实例化之前被调用,如果返回的值不为null,那么会跳过默认的实例化过程(可以实现定制化的实例化过程)
    2 postProcessAfterInstantiation
    在bean通过构造函数或是工厂方法实例化之后被回掉,这个时候属性还没有被填充,默认返回true,如果返回true,继续的执行填充属性的流程,如果返回false,不会填充属性,且后续的InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation也不会被执行。

    SmartInstantiationAwareBeanPostProcessor

    继承于InstantiationAwareBeanPostProcessor,所谓的smart就是带有了预言和检测的能力。
    提供了几个默认的方法
    1 predictBeanType 预判执行postProcessBeforeInstantiation之后返回的类型,默认是null
    2 determineCandidateConstructors 检查这个bean的构造函数
    3 getEarlyBeanReference 返回一个 early的引用类型,在bean之间有循环依赖的时候很有用。

    以上提供的三个interface一般用的比较少,我们可以使用spring提供给我们的一个已经实现了上面接口的适配类
    InstantiationAwareBeanPostProcessorAdapter,就是把上面的接口都默认实现了,我们只要重写其中的方法就可以了。下面一张图来展示接口中各个回调方法的执行时机。


    openapi (3).png

    可以看到在生成bean的各个点spring都提供了钩子方法,我们可以很方便的插入我们的自定义的逻辑。

    相关文章

      网友评论

          本文标题:Spring BeanPostProcessor 整理

          本文链接:https://www.haomeiwen.com/subject/vknnoktx.html