Web項目中獲取SpringBean——在非Spring組件中獲取SpringBean


  最近在做項目的時候我發現一個問題:Spring的IOC容器不能在Web中被引用(或者說不能被任意地引用)。我們在配置文件中讓Spring自動裝配,但並沒有留住ApplicationContext的實例。我們如果希望在我們的項目中任何位置都能拿到同一個ApplicationContext來獲取IOC容器中的資源,就要讓Spring將上下文環境填充到我們能獲取的地方,比如下面的做法(來自網絡資源):

  自定義一個工具類,實現自ApplicationContextAware接口,接口的方法是setApplicationContext,我們實現它,並讓其為我們服務,因為Spring在load自己的時候會將上下文環境填充進來。我們所要做的就是將得到的ApplicationContext保存下來用。

 1 package org.coderecord.ccms.web.action.util;
 2 
 3 import org.springframework.beans.BeansException;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.ApplicationContextAware;
 6 
 7 /**
 8  * Spring IOC上下文工具類
 9  * 
10  * @author Ryan Shaw
11  * 
12  */
13 public class SpringUtil implements ApplicationContextAware {
14 
15     /**
16      * 當前IOC
17      */
18     private static ApplicationContext applicationContext;
19 
20     /**
21      * 設置當前上下文環境,此方法由spring自動裝配
22      */
23     @Override
24     public void setApplicationContext(ApplicationContext arg0)
25             throws BeansException {
26         applicationContext = arg0;
27     }
28 
29     /**
30      * 從當前IOC獲取bean
31      * 
32      * @param id
33      *            bean的id
34      * @return
35      */
36     public static Object getObject(String id) {
37         Object object = null;
38         object = applicationContext.getBean(id);
39         return object;
40     }
41 
42 }

  上文的類就是我們要用的,而其中的setApplicationContext是接口中需要實現的,Spring會自動進行填充。我們在Spring的配置文件中注冊一下:

1 <bean id="springUtil" class="org.coderecord.ccms.web.action.util.SpringUtil" />

  這樣就可以了,Spring把我們需要的東西給我們了。

  我們就可以在需要的地方這樣做:

1 YouClass obj = (YouClass)SpringUtil.getObject("beanid");

  當然,前提是你需要讓Spring自動裝配哦。

  

  以下為方法二,使用了注解和靜態化的方式來產生SpringFactory對象

  來自網絡資源,修改於2013-04-11 15:25:57 

  上文的方法有個麻煩的地方:需要配置。而Spring2.5及之后的版本實際上加入了注解的方式進行依賴項的注入,使用如下代碼也許更好:

 1 package org.ahe.util;
 2 
 3 import org.springframework.beans.factory.BeanFactory;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.web.context.support.SpringBeanAutowiringSupport;
 6 
 7 public class SpringWiredBean extends SpringBeanAutowiringSupport {
 8 
 9     /**
10      * 自動裝配注解會讓Spring通過類型匹配為beanFactory注入示例
11      */
12     @Autowired
13     private BeanFactory beanFactory;
14 
15     private SpringWiredBean() {
16     }
17 
18     private static SpringWiredBean instance;
19 
20     static {
21         // 靜態塊,初始化實例
22         instance = new SpringWiredBean();
23     }
24 
25     /**
26      * 實例方法
27      * 使用的時候先通過getInstance方法獲取實例
28      * 
29      * @param beanId
30      * @return
31      */
32     public Object getBeanById(String beanId) {
33         return beanFactory.getBean(beanId);
34     }
35 
36     public static SpringWiredBean getInstance() {
37         return instance;
38     }
39 }

  如果使用@Autowired注解自動裝配的話,繼承SpringBeanAutowiringSupport類是不能少的。當然,使用@Component等注解也是可以的。使用注解的話配置就需要改動了,不過因為我們為支持Spring注解的配置是可以多用的,所以還好。如下:

1 <context:component-scan base-package="org.ahe"></context:component-scan>

  該配置即可讓org.ahe下所有包(您依然可以通過子標簽的正則表達式匹配來進行更多設置)下的注解起作用。

 

 歡迎您移步我們的交流群,無聊的時候大家一起打發時間:Programmer Union

 或者通過QQ與我聯系:點擊這里給我發消息

     (最后編輯時間2013-04-11 16:59:45)


免責聲明!

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



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