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></bean>
否則將獲取不到ApplicationContext ,返回Null 。
以上內容給大家介紹了Java中Spring獲取bean方法小結,希望大家喜歡。