m0_62608451 2022-07-18 16:51 采纳率: 60%
浏览 137
已结题

编写springboot插件,完成对IOC容器中的Bean的属性修改

img

编写的插件需要满足第一个要求,请给出测试代码的截图和运行效果截图。

  • 写回答

3条回答 默认 最新

  • LouD_dm 2022-07-18 17:31
    关注

    1.代码示例

    @Component
    public class TestBean implements SmartInitializingSingleton {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public void afterSingletonsInstantiated() {
            System.out.println(this);
            System.out.println("单例Bean实预例化完成之后调用接口");
            this.setName("单例Bean实预例化完成之后调用接口");
        }
    
        @Override
        public String toString() {
            return "TestBean{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    
    @Component
    public class TestBeanPostProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            // 在任何 bean 初始化回调
            //(如 InitializingBean 的 afterPropertiesSet 或自定义 init 方法)之前将此 BeanPostProcessor 应用于给定的新 bean 实例。
            // bean 将已填充属性值。返回的 bean 实例可能是原始的包装器
            if(bean instanceof TestBean){
                System.out.println("bean初始化前回调:" + bean);
                TestBean bean1 = (TestBean) bean;
                bean1.setName("bean初始化前回调");
                return BeanPostProcessor.super.postProcessBeforeInitialization(bean1, beanName);
            }
            return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            // 在任何 bean 初始化回调(如 InitializingBean 的 afterPropertiesSet 或自定义 init 方法)之后,
            // 将此 BeanPostProcessor 应用于给定的新 bean 实例。 bean 将已填充属性值
            if(bean instanceof TestBean){
                System.out.println("bean初始化后回调:" + bean);
                TestBean bean1 = (TestBean) bean;
                bean1.setName("bean初始化后回调");
                return BeanPostProcessor.super.postProcessBeforeInitialization(bean1, beanName);
            }
    
            return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
        }
    }
    
    @SpringBootTest
    class SpringbootTestApplicationTests {
    
        @Autowired
        private TestBean testBean;
    
        @Test
        void testBeanPostProcessorAndSmartInitializingSingleton() {
            System.out.println(testBean);
        }
    
    }
    

    2.BeanPostProcessor有两个方法,一个在Bean初始化前回调,一个初始化后回调,但都在SmartInitializingSingleton之前执行

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月26日
  • 已采纳回答 7月18日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看