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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效