在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