讓Bean獲取Spring容器

    在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

相關文章
相關標籤/搜索