• Spring BeanPostProcessor 代码实践



    Bean后置处理器接口,在初始化方法前后执行,允许对新建的Bean实例进行自定义修改,如检查标记接口或者包装为代理类。

    源码

    
    package org.springframework.beans.factory.config;
    
    import org.springframework.beans.BeansException;
    import org.springframework.lang.Nullable;
    
    public interface BeanPostProcessor {
    
    	/**
    	 * 在属性填充完成之后,初始化方法(afterPropertiesSet 或者 @PostConstruct)之前执行。
    	 */
    	@Nullable
    	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    	/**
    	 * 初始化方法之后之前执行。
    	 */
    	@Nullable
    	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    执行时机

    在Bean实例创建并完成属性填充之后,调用AbstractAutowireCapableBeanFactoryinitializeBean方法初始化Bean。在初始化前后分别执行了 postProcessBeforeInitializationpostProcessAfterInitialization 方法。
    Spring BeanPostProcessor 执行时机

    代码实践

    新建一个BeanPostProcessor实例

    /**
     * 对所有Spring管理的Bean都有效
     * */
    @Slf4j
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            log.info("执行 BeanPostProcessor.postProcessBeforeInitialization 方法, beanName=>{}", bean, beanName);
            return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            log.info("执行 BeanPostProcessor.postProcessAfterInitialization 方法, beanName=>{}", bean, beanName);
            return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    新建一个Spring Component类,并实现依赖注入和初始化方法

    @Slf4j
    @Component
    public class BeanPostProcessorDemo implements InitializingBean {
    
        private AnotherComponent anotherComponent;
    
        @Autowired
        public void setAnotherComponent(AnotherComponent anotherComponent) {
            log.info("执行依赖注入");
            this.anotherComponent = anotherComponent;
        }
    
        @PostConstruct
        public void init(){
            log.info("执行 @PostConstruct 标注的方法");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            log.info("执行 InitializingBean.afterPropertiesSet 方法");
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    运行结果

    执行顺序为:依赖注入 > postProcessBeforeInitialization > @PostConstruct > afterPropertiesSet > postProcessAfterInitialization
    Spring BeanPostProcessor
    注:BeanPostProcessor默认是会对整个Spring容器中所有的bean进行处理。

  • 相关阅读:
    第3周学习:ResNet+ResNeXt
    vmware-vmx.exe无法结束进程, 关闭Hyper-v虚拟服务
    Flutter自定义输入框同时出现多种字体颜色
    计算机网络-数据链路层
    【矩阵论】2. 矩阵分解——正规谱分解——正规阵
    NR 5G 终端TMSI上报
    一个数组去重(filter函数)
    vmware虚拟机安装macos系统?vmware虚拟机安装macos系统教程
    免费IP代理-如何更改自己的IP做到匿名浏览
    SpringBoot项目--电脑商城【增加/减少购物车商品数量】
  • 原文地址:https://blog.csdn.net/u012359704/article/details/126815686