本文共 1853 字,大约阅读时间需要 6 分钟。
Spring提供了很多以Aware结尾的接口,我们可以通过类实现接口和接口中要实现的方法,获取Spring资源。
大致过程:在使用Bean的时候,Spring会首先判断该Bean是否实现了Aware接口,如果实现了,在Spring初始化Bean的时候就会通过函数回调而调用Bean对象对Aware接口的实现方法,获取相应资源。
(如何理解回调函数,见)
总之,通过Aware接口,可以对Spring相应资源进行操作,但是一定要操作要慎重。这种机制给Spring进行简单的扩展提供了入口,方便又实用。
Aware提供的一系列接口:
下面说一个Spring下对Aware具体的应用例子:
###### 实现类TerenceApplicationContext
(实现ApplicationContextAware接口):
public class TerenceApplicationContext implements ApplicationContextAware { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext=applicationContext; System.out.println("TAContext:"+applicationContext.getBean("terenceApplicationContext")); } public void a() { System.out.println(applicationContext.hashCode()); }}
###### 配置文件spring-aware.xml:
##### 测试类TestAware
@RunWith(BlockJUnit4ClassRunner.class)public class TestAware extends UnitTestBase { public TestAware() { super("classpath*:spring-aware.xml"); } @Test public void testTerenceApplicationContext() { System.out.println("tAC Bean的定:"+super.getBean("terenceApplicationContext")); }}
####测试结果:
整体执行流程:在测试类中,通过super.getBean(“……”),调用父类UnitTestBased函数的getBean方法,通过上下文,在配置文件spring-aware.xml文件中找到对应的实现类并初始化,得到一个实例对象Bean。
第一行:TAContext:com.terence.aware.TerenceApplicationContext@11e86299
表示通过配置文件得到的接口的实现类terenceApplicationContext,经过函数回调执行了接口实现类中的实现方法setApplication()得到的Bean定义的上下问名称。
第二行:tAC Bean的定义:com.terence.aware.TerenceApplicationContext@11e86299
表示的是测试类中打印出来的方法Bean对象定义类的上下文名称,参见整体执行流程。