最近做項目需要用到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");
這個類提供了方便的功能,這樣你就不必去記 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
@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);
}
}