Aware接口
- Spring中提供了一些以Aware结尾的接口,实现Aware接口的Bean在被初始化之后,可以获取相应资源
- 通过Aware接口,可以对Spring相应资源进行操作
- 为对Spring进行简单的扩展提供了方便的入口
例如ApplicationContextAware接口,BeanNameAware接口。
以下对ApplicationContextAware接口,BeanNameAware接口进行简要的分析;
ApplicationContextAware接口用于在Bean中获取ApplicationContext实例。
BeanNameAware接口用于在Bean中获取当前Bean注册到IoC容器中的id名称。
测试前准备工作
说明ABCApplicationContext.java 实现ApplicationContextAware接口的类
ABCBeanName.java 实现BeanNameAware接口的类
AwareTest.java 单元测试类
Spring-aware.xml SpringBean配置文件
- ABCBeanName.java
package com.abc; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class ABCApplicationContext implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { // TODO Auto-generated method stub ABCApplicationContext context = (ABCApplicationContext)applicationContext.getBean("applicationContextAware"); System.out.println("ABCApplicationContext " + context.getClass().getName()); } }
ABCBeanName.java
package com.abc; import org.springframework.beans.factory.BeanNameAware; public class ABCBeanName implements BeanNameAware { @Override public void setBeanName(String name) { // TODO Auto-generated method stub System.out.println("ABCBeanName " + name); } }
AwareTest.java
package com.abc; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; import org.springframework.context.support.ClassPathXmlApplicationContext; @RunWith(BlockJUnit4ClassRunner.class) public class AwareTest { private ClassPathXmlApplicationContext context = null; @Before public void init(){ context = new ClassPathXmlApplicationContext("classpath:Spring-aware.xml"); } @After public void destroy(){ context.destroy(); } @Test public void test(){ } }
Spring-aware.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="applicationContextAware" class="com.abc.ABCApplicationContext"></bean> <bean id="beanNameAware" class="com.abc.ABCBeanName"></bean> </beans>
测试结果
四月 25, 2017 8:22:24 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@182decdb: startup date [Tue Apr 25 08:22:24 HKT 2017]; root of context hierarchy 四月 25, 2017 8:22:24 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [Spring-aware.xml] ABCApplicationContext com.pioneer.other.ABCApplicationContext ABCBeanName beanNameAware 四月 25, 2017 8:22:25 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@182decdb: startup date [Tue Apr 25 08:22:24 HKT 2017]; root of context hierarchy
结论:ApplicationContextAware接口,BeanNameAware接口 可以认为是获取相应Spring容器资源的回调方法,可以方便的获取到相应的资源。一个Bean同时实现ApplicationContextAware接口,BeanNameAware接口,IoC容器的调用顺序是BeanNameAware接口的实现,然后是ApplicationContextAware接口的实现。