Java中Spring擷取bean方法小結_java

來源:互聯網
上載者:User

Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器架構,如何在程式中擷取Spring配置的bean呢?

Bean工廠(com.springframework.beans.factory.BeanFactory)是Spring架構最核心的介面,它提供了進階IoC的配置機制。BeanFactory使管理不同類型的Java對象成為可能,應用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基礎之上,提供了更多面嚮應用的功能,它提供了國際化支援和架構事件體系,更易於建立實際應用。我們一般稱BeanFactory為IoC容器,而稱ApplicationContext為應用上下文。但有時為了行文方便,我們也將ApplicationContext稱為Spring容器。

對於兩者的用途,我們可以進行簡單劃分:BeanFactory是Spring架構的基礎設施,面向Spring本身;ApplicationContext面向使用Spring架構的開發人員,幾乎所有的應用場合我們都直接使用ApplicationContext而非底層的BeanFactory。

ApplicationContext的初始化和BeanFactory有一個重大的區別: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架構的獨立應用程式,僅僅推薦使用在程式需要通過設定檔手工初始化Spring的情況。ApplicationContext的主要實作類別是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者預設從類路徑載入設定檔,後者預設從檔案系統中裝載設定檔

例子:

public class BeanManager {private static ApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml") ;public static Object getBean(String beanId) {return context.getBean(beanId);}}

在 web.xml 中寫一個 servlet ,自動啟動, init 方法中調用一下 BeanManager

init() throws ServletException {BeanManager bm = new BeanManager();//可選的,為的是在 web 應用啟動的時候就讓 spring 載入 bean 配置。// 否則會在第一次調用 BeanManager 的時候載入,影響一次速度。}

在 java 代碼中使用 BeanManager.getBean(String beanId); 來獲得 bean 執行個體。

第二種擷取 ApplicationContext 的方法: 通過Spring提供的工具類擷取ApplicationContext對象,專為web工程定製的方法,推薦Web項目中使用。例如:

ServletContext servletContext = request.getSession().getServletContext();ApplicationContext ac1 = WebApplicationContextUtils .getRequiredWebApplicationContext(ServletContext sc)ApplicationContext ac2 = WebApplicationContextUtils .getWebApplicationContext(ServletContext sc)ac1.getBean("beanId");ac2.getBean("beanId");

通過javax.servlet.ServletContext 擷取到ApplicationContext執行個體對象,這意味著,必須使用到request、session等等。

這樣,就不能把ApplicationContext對象設定為成員變數。需要在每個具體的方法中通過request、session等擷取到ServletContext再擷取ApplicationContext執行個體。

因此,此方法僅僅推薦使用在可以擷取到ServletContext對象的Web項目中,並且不需要將ApplicationContext對象定義為成員變數的情況下。

注意:當使用WebApplicationContextUtils擷取ApplicationContext執行個體時,需要在web.xml設定檔中添加org.springframework.web.context.ContextLoaderListener監聽器,否則擷取不到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>

3. 繼承自抽象類別ApplicationObjectSupport

抽象類別ApplicationObjectSupport提供getApplicationContext()方法,可以方便的擷取到ApplicationContext。Spring初始化時,會通過該抽象類別的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。

4. 繼承自抽象類別WebApplicationObjectSupport

通過繼承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);

5. 實現介面ApplicationContextAware

實現該介面的setApplicationContext(ApplicationContext context)方法,並儲存ApplicationContext 對象。Spring初始化時,會通過該方法將ApplicationContext 對象注入。

第三、四、五種方法都需要將類配置在 Spring 設定檔中:

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

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

以上內容給大家介紹了Java中Spring擷取bean方法小結,希望大家喜歡。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.