獲取spring容器上下文(webApplicationContext)的幾種方法


在很多情況,我們需要先獲取spring容器上下文,即webApplicationContext,然后通過webApplicationContext來獲取其中的bean。典型的情況是,我想在一個並未委托給spring容器管理的對象里,去引用一個spring容器管理的對象,此時,@Resource注解是無法發揮作用的。此時必須使用webApplicationContext.getBean("beanName")才能從容器中取到這個java對象,不然我們就只能自己去new了。

  方法1::ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

  經驗證是可行的,但是有個問題,就是執行這句代碼的時候很耗時。本人猜測這句代碼會重新new一個容器對象,相當於重新載入了一次applicationContext.xml里面配置的類,重新去create一個ApplicationContext,而不是去拿在項目啟動之初生成的那個ApplicationContext。

  方法2.首先建立一個工具類

復制代碼
package com.wonyen.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class MySpringContext implements ApplicationContextAware { private static ApplicationContext context;//聲明一個靜態變量用於保存spring容器上下文  @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.context=context; } public static ApplicationContext getContext(){ return context; } }
復制代碼

  1.可見該工具類實現了ApplicationContextAware接口,實現該接口的類會接收到spring容器傳過來的ApplicationContext對象,從而可以實現操縱spring容器中的所有bean的效果。但是這里我們並不在這個工具類里面去獲取bean,我們暫且把獲取來的ApplicationContext對象存放起來,放在哪里呢,就是放在該類的一個靜態變量中context中,然后我們再給它一個靜態的get方法,供其他的類去調用。

  2.有了這個工具類還沒用,spring容器不會無緣無故去執行setApplicationContext方法把ApplicationContext 對象傳入給它,所以必須在ApplicationContext.xml文件里面去配置,如下所示。

<!-- util --> <bean class="com.wonyen.util.MySpringContext"></bean> 

  這樣,當項目啟動時,就會加載這個工具類,並把ApplicationContext 傳入。當然你也可以采用注解的方式,即在該類上加上@Component注解。

  3.在其他類調用,只需要這樣一行代碼就可以了。

ApplicationContext context =MySpringContext.getContext();

  經驗證,采用這種方式獲取的ApplicationContext的速度明顯比前面那種快很多。

  方法3:還有一種方法可以獲取ApplicationContext,就是傳入一個ServletContext對象。然后用WebApplicationContextUtils的getWebApplicationContext獲取一個WebApplicationContext,WebApplicationContext是ApplicationContext的子類,他比ApplicationContext類多了一個獲取ServletContext的方法。

ServletContext servletContext = event.getServletContext();
 ApplicationContext application = WebApplicationContextUtils .getWebApplicationContext(servletContext);

   其實上述方法能獲取到WebApplicationContext時因為web項目在啟動的時候,在啟動spring容器的時候,把WebApplicationContext作為一個屬性放入了ServletContext中,所以我們才可以采用spring提供的這個方法來獲取到WebApplicationContext。

  方法4:因為WebApplicationContext是ApplicationContext的子類,所以獲取到WebApplicationContext其實就是獲取到了ApplicationContext。所以還有一種更為簡單的方法,直接通過ContextLoader的靜態方法getCurrentWebApplicationContext()就可以獲取到當前的WebApplicationContext對象.

代碼如下:

WebApplicationContext webApplicationContext = ContextLoader
                .getCurrentWebApplicationContext();

   PSSS:關於第一種方法和后面三種方法,為了驗證猜想,即采用new ClassPathXmlApplicationContext("applicationContext.xml");這種方法會重新生成一個ApplicationContext對象,做了如下代碼的驗證。

ApplicationContext context = MySpringContext.getContext();
        ApplicationContext newContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); System.out.println("獲取已有的ApplicationContext對象" + context); System.out.println("新建的ApplicationContext" + newContext);

  得到的結果是:

  可見這兩個確實不是同一個對象。驗證成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM