Aware接口
Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源
通过Aware接口,可以对Spring相应资源进行操作(使用需慎重)
为对Spring进行简单的扩展提供了方便的入口
ApplicationContextAware
实现了ApplicationContextAware接口的类将会获得ApplicationContext实例的引用
BeanNameAware
实现BeanNameAware接口的类将会获得该类对象的bean定义的name值(id)
主要Aware子接口

Aware相关示例
ApplicationContextAware
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MoocApplicationContext implements ApplicationContextAware {
//定义成员变量
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
//获取spring上下文进行相关操作
this.applicationContext = applicationContext;
System.out.println("MoocApplicationContext : " + applicationContext.getBean("moocApplicationContext").hashCode());
}
}
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase {
public TestAware() {
super("classpath:spring-aware.xml");
}
@Test
public void testMoocApplicationContext() {
System.out.println("testMoocApplicationContext : " + super.getBean("moocApplicationContext").hashCode());
//执行结果为: MoocApplicationContext : 1795799895
// testMoocApplicationContext : 1795799895
}
}
<bean id="moocApplicationContext" class="com.rxy.aware.MoocApplicationContext" ></bean>
BeanNameAware
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MoocBeanName implements BeanNameAware, ApplicationContextAware {
private String beanName;
@Override
public void setBeanName(String name) {
this.beanName = name;
System.out.println("MoocBeanName : " + name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
System.out.println("setApplicationContext : " + applicationContext.getBean(this.beanName).hashCode());
}
}
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase {
public TestAware() {
super("classpath:spring-aware.xml");
}
@Test
public void textMoocBeanName() {
System.out.println("textMoocBeanName : " + super.getBean("moocBeanName").hashCode());
//MoocBeanName : moocBeanName
//setApplicationContext : 1795799895
//textMoocBeanName : 1795799895
}
}
<bean id="moocBeanName" class="com.imooc.aware.MoocBeanName" ></bean>
注意:不同Aware接口执行顺序不同,如ApplicationContextAware的方法在BeanNameAware的方法执行之后,所以setBeanName中无法获取上下文对象
网友评论