电竞比分网-中国电竞赛事及体育赛事平台

分享

Java普通類獲取Spring XML中Bean的方法總結

 集微筆記 2014-01-03

這篇文章是過于理論的東西,這里有一份能夠直接使用的封裝好的源碼:Spring MVC3.2 通用獲取bean封裝源碼

   Bean工廠(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高級IoC的配置機制。BeanFactory使管理不同類型的Java對象成為可能,應用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基礎之上,提供了更多面向應用的功能,它提供了國際化支持和框架事件體系,更易于創(chuàng)建實際應用。我們一般稱BeanFactory為IoC容器,而稱ApplicationContext為應用上下文。但有時為了行文方便,我們也將ApplicationContext稱為Spring容器。
   對于兩者的用途,我們可以進行簡單劃分:BeanFactory是Spring框架的基礎設施,面向Spring本身;ApplicationContext面向使用Spring框架的開發(fā)者,幾乎所有的應用場合我們都直接使用ApplicationContext而非底層的BeanFactory。
   ApplicationContext的初始化和BeanFactory有一個重大的區(qū)別:BeanFactory在初始化容器時,并未實例化Bean,直到第一次訪問某個Bean時才實例目標Bean;而ApplicationContext則在初始化應用上下文時就實例化所有單實例的Bean。因此ApplicationContext的初始化時間會比BeanFactory稍長一些

   本文不涉及通過@Resource、@Autowired 自動注入,僅僅通過ApplicationContext獲取Sping配置文件中的Bean。

   要獲取XML中配置的Bean,最關鍵的是獲取org.springframework.context.ApplicationContext

   第一種獲取ApplicationContext的方法:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("applicationContext.xml");
或者
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

   這種方式實例化applicationContext是非常耗時的,僅僅推薦使用在程序需要通過配置文件手工初始化Spring的情況。
   ApplicationContext的主要實現(xiàn)類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默認從類路徑加載配置文件,后者默認從文件系統(tǒng)中裝載配置文件

   第二種獲取ApplicationContext的方法:

   Spring提供了WebApplicationContextUtils.getWebApplicationContext方法來獲取ApplicationContext對象。

import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletContext;
ApplicationContext applicationContext = 
WebApplicationContextUtils.getWebApplicationContext(ServletContext servletContext);
//ServletContext servletcontext = request.getSession().getServletContext();

   通過javax.servlet.ServletContext 獲取到ApplicationContext實例對象,這意味著,必須使用到request、session等等。
   這樣,就不能把ApplicationContext對象設置為成員變量。需要在每個具體的方法中通過request、session等獲取到ServletContext再獲取ApplicationContext實例。
   因此,此方法僅僅推薦使用在可以獲取到ServletContext對象的Web項目中,并且不需要將ApplicationContext對象定義為成員變量的情況下。

   注意:當使用WebApplicationContextUtils獲取ApplicationContext實例時,需要在web.xml配置文件中添加org.springframework.web.context.ContextLoaderListener監(jiān)聽器,否則獲取不到ApplicationContext對象,返回Null。

   配置文件:web.xml

<!--ContextLoaderListener自動注入  applicationContext,通過
WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext())獲取 -->
<!--Spring配置文件加載位置 -->
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/spring/appContext.xml,/WEB-INF/spring/appInterceptor.xml</param-value>
</context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

   第三種獲取ApplicationContext的方法:

   通過繼承org.springframework.context.support.ApplicationObjectSupport使用getApplicationContext()獲取ApplicationContext實例
   Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。

   第四種獲取WebApplicationContext的方法:

   通過繼承org.springframework.web.context.support.WebApplicationObjectSupport使用getWebApplicationContext() 獲取到org.springframework.web.context.WebApplicationContext
   由于Web應用比一般的應用擁有更多的特性,因此WebApplicationContext擴展了ApplicationContext。WebApplicationContext定義了一個常量ROOT_WEB_APPLICATION_ CONTEXT_ATTRIBUTE,在上下文啟動時,WebApplicationContext實例即以此為鍵放置在ServletContext的屬性列表中,因此我們可以直接通過以下語句從Web容器中獲取WebApplicationContext:

WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

   第五種獲取ApplicationContext的方法:

   通過實現(xiàn)org.springframework.context.ApplicationContextAware接口,實現(xiàn)該接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 對象。 Spring初始化時,會通過該方法將ApplicationContext對象注入。

   第三、四、五種方法都需要將類配置在Spring配置文件中:

<!--假定ApplicationContextTool為繼承或者實現(xiàn)了第三、四、五種方法的具體實現(xiàn)類-->
<bean class="com.twovv.utils.ApplicationContextTool"></bean>

   否則將獲取不到ApplicationContext,返回Null。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多