Eric_STF 2018-02-05 09:46 采纳率: 0%
浏览 3156
已结题

为什么BeanPostProcessor的回调函数没被调用

public class MyBean implements BeanPostProcessor {

public void say(){
    System.out.printf("hello");
}

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    return bean;
}

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    return bean;
}

}

public class Main {

public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring/spring-config.xml"});
    MyBean myBean = context.getBean(MyBean.class);
    myBean.say();
}

}

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<bean id="myBean" class="com.alibaba.dubbo.demo.MyBean" />

运行结果:
[05/02/18 05:08:53:053 CST] main INFO support.ClassPathXmlApplicationContext: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6d9c638: startup date [Mon Feb 05 17:08:53 CST 2018]; root of context hierarchy
[05/02/18 05:08:53:053 CST] main INFO xml.XmlBeanDefinitionReader: Loading XML bean definitions from class path resource [spring/spring-config.xml]
inithello
Process finished with exit code 0

期待的市BeanPostProcessor里的before和after方法被调用,但实际没有。有谁知道为什么吗?

  • 写回答

3条回答

  • 罗纳尔哆啦A萌 2018-08-03 02:28
    关注

    BeanPostProcessor类是为了让创建其他类的时候进行创建前后的一些操作,你这么写一般是不会调用postProcessBeforeInitialization()和postProcessAfterInitialization()方法的。原因就是。在容器初始化定义的bean创建之前,容器会自己去查找所有的beanPostProcessor进行创建,你自定义的类,由于是实现了BeanPostProcessor接口,因此这时候会进行BeanPostProcessor的创建和注册,源码中,在注册BeanPostProcessor会进行getBean操作,即创建自定义的bean。由于默认的是单例模式,因此后面再次进行获取就不会再次调用postProcessBeforeInitialization()和postProcessAfterInitialization()方法,因为已经放入了spring缓存,直接获取,不需要实例,因此没有调用。如果你真的想使用的时候调用postProcessBeforeInitialization()和postProcessAfterInitialization()方法,将你的bean设置为原型模式(prototype),这样每次调用都会创建,因此初始化容器之后每次都会调用的。

    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧