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

img

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

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

好巧,在线等

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632