获取spring的ApplicationContext几种方式
一种是实现ApplicationContextAware
接口,一种是跟普通的自动注入一样。
下面是Spring高版本才提供的:
记住只能有一个构造函数,上面有两个构造函数是错误,随意删除一个即可。同时注意有
User
参数的构造函数,必须在Spring容器有User
类型的对象才行。
探讨ApplicationContextAware
的实现原理——BeanPostProcessor
记住一定要交给Spring管理。
BeanPostProcessor
中的postProcessBeforeInitialization
方法会在类实例化并且设置完属性之后调用,而postProcessAfterInitialization
会在init
方法调用之后调用。现在写个例子来测试一下:
下面是一个Book
类:
开始测试:
运行结果:
请注意输出,你看到的不是一次
TestBeanPostProcessor
相关方法的执行,而是三次,为什么?因为Spring也会初始化一些bean,在初始化这些Bean的时候也会调用实现BeanPostProcessor
的类的相应方法。
探讨ApplicationContextAware
的实现原理——BeanPostProcessor
的用处——实现代理
下面是一个BeanPostProcessor
接口的类:
请注意上面两个方法都返回另一个对象。
看看最后能不能返回LogDog2
类型的对象。
探讨ApplicationContextAware
的实现原理——使用BeanPostProcessor
实现ApplicationContextAware
定义一个接口:
实现MyApplicationContextAware
接口的Cat
类:
MyApplicationContext
的BeanPostProcessor
:
这就是为什么只要实现一个接口就可以实现属性注入的原理: