1. 程式人生 > >spring 初始化ApplicationContext的幾種方式

spring 初始化ApplicationContext的幾種方式

最近做專案需要用到getBean(),在網上搜索之後發現有很多種方式獲取ApplicationContext,做了些許嘗試,解決了我的問題,決定把搜到的東西進行彙總,供大家學習。

方法一:FileSystemXmlApplicationContext

//1.預設為專案工作路徑 即專案的根目錄 
ApplicationContext appCt2 = new FileSystemXmlApplicationContext("src/main/resources/app.spring.xml"); 
appCt2.getBean("beanId");
//2.字首classpath:表示的是專案的classpath下相對路徑 
ApplicationContext appCt2 = new FileSystemXmlApplicationContext("classpath:app.spring.xml"); 
appCt2.getBean("beanId");
//3.使用字首file 表示的是檔案的絕對路徑 
   ApplicationContext appCt2 = new FileSystemXmlApplicationContext("file:D:/app.spring.xml"); 
   ApplicationContext appCt2 = new FileSystemXmlApplicationContext("D:/app.spring.xml"); 
   appCt2.getBean("beanId");
//4.可以同時載入多個檔案 
  String[] xmlCfg = new String[] { "src/main/resources/base.spring.xml","classpath:app.spring.xml"}; 
  ApplicationContext appCt2 = new FileSystemXmlApplicationContext(xmlCfg); 
  appCt2.getBean("beanId");
//5.使用萬用字元載入所有符合要求的檔案 
  ApplicationContext appCt2 = new FileSystemXmlApplicationContext("classpath:*.spring.xml"); 
  appCt2.getBean("beanId");
//6.Resource 
ResourcePatternResolver     resolver=new PathmatchingResourceResolver(); 
Resource   res = resolver.getResource("classpath:com/hh/beans.xml"); 
Beanfactory    bf = new  XmlBeanFactory(res); 
Car  car= bf.getBean("car",Car.class) 
這種方式適用於採用Spring框架的獨立應用程式,需要程式通過配置檔案手工初始化Spring的情況。
方法二:通過Spring提供的工具類WebApplicationContextUtils獲取ApplicationContext物件
import org.springframework.web.context.support.WebApplicationContextUtils; 
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId"); 
ac2.getBean("beanId");
這種方式適合於採用Spring框架的B/S系統,通過ServletContext物件獲取ApplicationContext物件,然後在通過它獲取需要的類例項。
這個類提供了方便的功能,這樣你就不必去記 ServletContext 中屬性的名字。 它的getWebApplicationContext() 方法在 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 這個鍵值不對應任何物件的時候將返回 null。不過,為了避免在應用中得到 NullPointerExceptions ,我們推薦你使用 getRequiredWebApplicationContext() 方法。這個方法在ApplicationContext 缺失的時候會丟擲一個異常。
上面兩個工具方式的區別是,前者在獲取失敗時丟擲異常,後者返回null。
方法三:ClassPathXmlApplicationContext (不推薦使用,比較費記憶體)
//1.沒有字首:預設為專案的classpath下相對路徑 
   ApplicationContext appCt = new ClassPathXmlApplicationContext("app.spring.xml"); 
//2.字首classpath:表示的是專案的classpath下相對路徑 
   ApplicationContext appCt = new ClassPathXmlApplicationContext("classpath:app.spring.xml"); 
//3.使用字首file 表示的是檔案的絕對路徑 
   ApplicationContext appCt = new ClassPathXmlApplicationContext("file:D:/app.spring.xml"); 
//4.可以同時載入多個檔案 
  String[] xmlCfg = new String[] { "classpath:base.spring.xml","app.spring.xml"}; 
  ApplicationContext appCt = new ClassPathXmlApplicationContext(xmlCfg); 
//5.使用萬用字元載入所有符合要求的檔案 
  ApplicationContext appCt = new ClassPathXmlApplicationContext("*.spring.xml");
方法四:繼承自抽象類ApplicationObjectSupport
抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。
Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 物件注入。

方法五:繼承自抽象類WebApplicationObjectSupport 類似上面方法,呼叫getWebApplicationContext()獲取WebApplicationContext  方法六:實現介面ApplicationContextAware (推薦使用) SpringContextsUtil 實現了介面ApplicationContextAware,setApplicationContext(ApplicationContext applicationContext)這個方法。Spring初始化的時候就將ApplicationContext 裝配好了,那麼專案中就可以直接使用applicationContext.getBean("beanId");
@Service
public class SpringContextsUtil implements ApplicationContextAware{

private static ApplicationContext applicationContext;    //Spring應用上下文環境   
  /**
  * 實現ApplicationContextAware介面的回撥方法,設定上下文環境  
  * @param applicationContext
  * @throws BeansException
  */
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    SpringContextsUtil.applicationContext = applicationContext;
  }

  /**
  * @return ApplicationContext
  */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }

  /**
  * 獲取物件  
  * @param name
  * @return Object 一個以所給名字註冊的bean的例項
  * @throws BeansException
  */
  public static Object getBean(String name) throws BeansException {
    return applicationContext.getBean(name);
  }

}