1. 程式人生 > >Java中如何獲取Spring中配置的bean

Java中如何獲取Spring中配置的bean

Spring中的ApplicationContexts可以被限制在不同的作用域。在web框架中,每個DispatcherServlet有它自己的WebApplicationContext,它包含了DispatcherServlet配置所需要的bean。DispatcherServlet 使用的預設BeanFactory是XmlBeanFactory,並且DispatcherServlet在初始化時會在你的web應用的WEB-INF目錄下尋找[servlet-name]-servlet.xml檔案。DispatcherServlet使用的預設值可以使用servlet初始化引數修改,

WebApplicationContext

僅僅是一個擁有web應用必要功能的普通ApplicationContext。它和一個標準的ApplicationContext的不同之處在於它能夠解析主題,並且它知道和那個servlet關聯(通過到ServletContext的連線)。WebApplicationContext被繫結在ServletContext上,當你需要的時候,可以使用RequestContextUtils找到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");