spring 实现ApplicationContextAware 具体过程是怎么执行的

java_sheng 发布于 2015/06/18 21:36
阅读 4K+
收藏 0

我们在spring 环境外 获取spring的上下文 可以实现 ApplicationContextAware    

但我不明白的是 我实现了这个接口  spring怎么知道我实现了?

当spring在启动的时候 是通过 java的反射机制 获取到ApplicationContextAware  的实现类 在在执行接口的所有方法吗  ?  具体怎么运行的  麻烦大神指点一下

搜索

复制

加载中
0
呵呵3547
呵呵3547

可以参考一个spring的源代码。在spring的3.2.1中不是通过反射设置,而是直接调用了set方法

1、类AbstractApplicationContext中的prepareBeanFactory这个方法中向beanFactory注册了一个beanPostProcessor。

beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

2、ApplicationContextAwareProcessor中参考方法invokeAwareInterfaces

if (bean instanceof ApplicationContextAware) {
                ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}

java_sheng
java_sheng
恩 还是看源码才知道.......谢谢了 不过看源码还是有点晕
0
whaon
whaon

首先你这个类也作为spring管理的bean

然后判断如果他实现了ApplicationContextAware    接口

就调用该接口的方法void setApplicationContext(ApplicationContext applicationContext)方法

即把ApplicationContext注入进来了

java_sheng
java_sheng
恩 知道了 谢谢
0
pantrick
pantrick
这就是判断bean的类型问题,给所有appcontextware类型调用setcontext方法,反正都在spring容器里管着,怎么弄都方便
java_sheng
java_sheng
谢谢了
0
cvincent
cvincent

1.你必须把这个 class 给了 spring 托管(无论你是打了@注解,然后配了扫描范围,或者是直接在 xml 中配了)

2.既然这个 class 你托管给了 spring ,spring 知道了它的存在,spring 在启动的时候就需要实例化这个 class(如果是懒加载就是你需要用到的时候实例化),在实例化这个 class 的时候,发现它包含这个 ApplicationContextAware 接口的话,sping 就会调用这个对象的 setApplicationContext 方法,把 applicationContext Set 进去了。

java_sheng
java_sheng
谢谢
0
b
blinnn
Class.getInterfaces()判断是否实现什么接口,后面想怎么干就怎么干了。
返回顶部
顶部