编写的插件需要满足第一个要求,请给出测试代码的截图和运行效果截图。
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之前执行
好巧,在线等
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!