在Web应用中,Spring容器一般采用声明式方法配置产生:开发者只要在web.xml中配置一个Listener,该Listener将会负责初始化Spring容器。前端MVC框架能够直接调用Spring容器(无须访问Spring容器自己)。在这种状况下,容器中Bean 处于容器管理下,无须主动访问容器,只接受容器的注入管理便可。Bean实列的依赖关系一般由容器动态注入,无须Bean实列主动请求。前端
在这种状况下,Spring容器中Bean一般不会须要访问容器中其余的Bean-采用依赖注入,让Spring把被依赖的Bean注入到依赖的Bean中便可。可是在一些特殊状况下,容器中的Bean可能须要主动访问Spring容器自己,实现BeanFactoryAware接口的Bean,拥有访问BeanFactory容器的能力,实现BeanFactoryAware接口的Bean的实列被容器建立之后,它会拥有一个引用,该引用指向建立它的BeanFactory。BeanFactoryAware接口只有以下一个方法:java
setBeanFactory(BeanFactory beanFactory):该方法有一个参数beanFactory,该参数指向建立它的BeanFactory。该方法由Spring来调用,当Spring调用该方法时,会将Spring容器做为参数传入该方法。与次相似的方法还有ApplicationContextAware接口的setApplicationContext(ApplicationConext applicationContext)。web
package com.custle.spring; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class Chineses implements ApplicationContextAware { //将BeanFactory容器以成员变量保存 private ApplicationContext ctx; /* 实现ApplicationContextAware接口必须实现的方法 * Spring经过该方法自动传入applicationContext容器 * applicationContext用于建立Bean实列 */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.ctx = applicationContext; } //获取ApplicationContext方法 public ApplicationContext getApplicationContext(){ return ctx; } }
将该Bean配置在xml中:spring
<bean id="chineses" class="com.custle.spring.Chineses"></bean>
经过实列化方法获取ApplicationContext和经过Chineses Bean来获取BeanFactory,并进行比较:app
package com.custle.spring; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ApplicationContextTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext-spring.xml"); Chineses chineses = (Chineses)applicationContext.getBean("chineses"); System.out.println(chineses.getApplicationContext()); //比较applicationContext对象是否相同 System.out.println(chineses.getApplicationContext() == applicationContext); } }
控制台输出:框架
org.springframework.context.support.ClassPathXmlApplicationContext@24e6d224: startup date [Mon Feb 05 14:31:23 CST 2018]; root of context hierarchy true
实现ApplicationContextAware接口让Bean拥有了访问容器的能力,但污染了代码,致使代码与Spring接口耦合在一块儿。ide