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);
  }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章