Spring在代碼中獲取bean的幾種方式


方法一:在初始化時保存ApplicationContext對象 方法二:通過Spring提供的utils類獲取ApplicationContext對象 方法三:繼承自抽象類ApplicationObjectSupport 方法四:繼承自抽象類WebApplicationObjectSupport 方法五:實現接口ApplicationContextAware 方法六:通過Spring提供的ContextLoader

獲取spring中bean的方式總結:

方法一:在初始化時保存ApplicationContext對象

1 ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");   
2 ac.getBean("beanId");  

方法二:通過Spring提供的工具類獲取ApplicationContext對象

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

說明:這種方式適合於采用Spring框架的B/S系統,通過ServletContext對象獲取ApplicationContext對象,然后在通過它獲取需要的類實例。上面兩個工具方式的區別是,前者在獲取失敗時拋出異常,后者返回null。

方法三:繼承自抽象類ApplicationObjectSupport

說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取ApplicationContext。

Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。

方法四:繼承自抽象類WebApplicationObjectSupport

說明:類似上面方法,調用getWebApplicationContext()獲取WebApplicationContext

方法五:實現接口ApplicationContextAware

說明:實現該接口的setApplicationContext(ApplicationContext context)方法,並保存ApplicationContext 對象。Spring初始化時,會通過該方法將ApplicationContext對象注入。

以下是實現ApplicationContextAware接口方式的代碼,前面兩種方法類似:

package com.ifaboo.MiomOmmg.util;  
  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.ApplicationContextAware;  
  
public class SpringContextUtil implements ApplicationContextAware {  
    private static ApplicationContext applicationContext;  
  
    /** 
     * 實現ApplicationContextAware接口的context注入函數, 將其存入靜態變量. 
     */  
    public void setApplicationContext(ApplicationContext applicationContext) {  
        SpringContextUtil.applicationContext = applicationContext; // NOSONAR  
    }  
  
    /** 
     * 取得存儲在靜態變量中的ApplicationContext. 
     */  
    public static ApplicationContext getApplicationContext() {  
        checkApplicationContext();  
        return applicationContext;  
    }  
  
    /** 
     * 從靜態變量ApplicationContext中取得Bean, 自動轉型為所賦值對象的類型. 
     */  
    @SuppressWarnings("unchecked")  
    public static <T> T getBean(String name) {  
        checkApplicationContext();  
        return (T) applicationContext.getBean(name);  
    }  
  
    /** 
     * 從靜態變量ApplicationContext中取得Bean, 自動轉型為所賦值對象的類型. 
     */  
    @SuppressWarnings("unchecked")  
    public static <T> T getBean(Class<T> clazz) {  
        checkApplicationContext();  
        return (T) applicationContext.getBeansOfType(clazz);  
    }  
  
    /** 
     * 清除applicationContext靜態變量. 
     */  
    public static void cleanApplicationContext() {  
        applicationContext = null;  
    }  
  
    private static void checkApplicationContext() {  
        if (applicationContext == null) {  
            throw new IllegalStateException("applicaitonContext未注入,請在applicationContext.xml中定義SpringContextHolder");  
        }  
    }  
  
}  

雖然,spring提供的后三種方法可以實現在普通的類中繼承或實現相應的類或接口來獲取spring 的ApplicationContext對象,但是在使用是一定要注意實現了這些類或接口的普通java類一定要在Spring 的配置文件applicationContext.xml文件中進行配置。否則獲取的ApplicationContext對象將為null。

方法六:通過Spring提供的ContextLoader

WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();  
wac.getBean(beanID);  

最后提供一種不依賴於servlet,不需要注入的方式。但是需要注意一點,在服務器啟動時,Spring容器初始化時,不能通過以下方法獲取Spring 容器,細節可以查看spring源碼org.springframework.web.context.ContextLoader。


免責聲明!

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



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