Java中如何獲取Spring中配置的bean
Spring中的ApplicationContexts可以被限制在不同的作用域。在web框架中,每個DispatcherServlet有它自己的WebApplicationContext,它包含了DispatcherServlet配置所需要的bean。DispatcherServlet 使用的預設BeanFactory是XmlBeanFactory,並且DispatcherServlet在初始化時會在你的web應用的WEB-INF目錄下尋找[servlet-name]-servlet.xml檔案。DispatcherServlet使用的預設值可以使用servlet初始化引數修改,
WebApplicationContext
Spring的DispatcherServlet有一組特殊的bean,用來處理請求和顯示相應的檢視。這些bean包含在Spring的框架裡,(可選擇)可以在WebApplicationContext中配置,配置方式就象配置其它bean的方式一樣。這些bean中的每一個都在下面被詳細描述。待一會兒,我們就會提到它們,但這裡僅僅是讓你知道它們的存在以便我們繼續討論DispatcherServlet。對大多數bean,都提供了預設值,所有你不必要擔心它們的值。
// 一下來源於網路
servletContext 是web應用程式的大環境,用於儲存整個web應用程式級別的物件,不知道這樣說法是否對.
ApplicationContext,WebApplicationContext 是Spring的BeanFactory,從名字中就可以知道區別拉,一個是支援web特性的BeanFactory。
Spring獲取WebApplicationContext與ApplicationContext的幾種方法:
方法一:在初始化時儲存ApplicationContext物件
程式碼:
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
說明:這種方式適用於採用Spring框架的獨立應用程式,需要程式通過配置檔案手工初始化Spring的情況。
方法二:通過Spring提供的工具類獲取ApplicationContext物件
程式碼:
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
說明:
這種方式適合於採用Spring框架的B/S系統,通過ServletContext物件獲取ApplicationContext物件,然後在通過它獲取需要的類例項。
上面兩個工具方式的區別是,前者在獲取失敗時丟擲異常,後者返回null。
其中 servletContext sc 可以具體 換成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 另外,由於spring是注入的物件放在ServletContext中的,所以可以直接在ServletContext取出 WebApplicationContext 物件: WebApplicationContext webApplicationContext
= (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
方法三:繼承自抽象類ApplicationObjectSupport
說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。
Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 物件注入。
方法四:繼承自抽象類WebApplicationObjectSupport
說明:類似上面方法,呼叫getWebApplicationContext()獲取WebApplicationContext
方法五:實現介面ApplicationContextAware
說明:實現該介面的setApplicationContext(ApplicationContext context)方法,並儲存ApplicationContext 物件。
Spring初始化時,會通過該方法將ApplicationContext物件注入。
在web應用中一般用ContextLoaderListener載入webapplication,如果需要在action之外或者control類之外獲取webapplication思路之一是,單獨寫個類放在static變數中
如下:
1.
public class SpringContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext;//Spring應用上下文環境
@Override
public void setApplicationContext(ApplicationContext applicationcontext)
throws BeansException {
// TODO Auto-generated method stub
SpringContextUtil.applicationContext=applicationcontext;
}
public static Object getBean(String name){
return applicationContext.getBean(name);
}
}
//applicationContext.xml 配置
// <bean id="SpringContextUtil" class="com.zjd.util.SpringContextUtil"/>
SpringContextUtil.getBean("bean id");
2.
WebApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext(servletContext);
ctx.getBean("bean id");