Spring在代碼中獲取bean的幾種方式詳解
方法如下
- 方法一:通過讀取XML文件反射生成對象
- 方法二:通過Spring提供的utils類獲取ApplicationContext對象
- 方法三:繼承自抽象類ApplicationObjectSupport
- 方法四:繼承自抽象類WebApplicationObjectSupport
- 方法五:實現接口ApplicationContextAware
- 方法六:通過Spring提供的ContextLoader
獲取spring中bean的方式總結:
方法一:通過讀取XML文件反射生成對象
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("userService");//比如:<bean id="userService" class="com.cloud.service.impl.UserServiceImpl"></bean>
說明:這樣的方式適用于採用Spring框架的獨立應用程序,須要程序通過配置文件手工初始化Spring的情況。
方法二:通過Spring提供的工具類獲取ApplicationContext對象
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
說明:這樣的方式適合于Spring框架的B/S系統(tǒng),通過ServletContext對象獲取ApplicationContext對象。然后在通過它獲取須要的類實例。上面兩個工具方式的差別是,前者在獲取失敗時拋出異常。后者返回null。
方法三:繼承自抽象類ApplicationObjectSupport
說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法。能夠方便的獲取ApplicationContext。
Spring初始化時。會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。
方法四:繼承自抽象類WebApplicationObjectSupport
說明:類似上面方法。調用getWebApplicationContext()獲取WebApplicationContext
方法五:實現接口ApplicationContextAware
說明:實現該接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 對象。Spring初始化時,會通過該方法將ApplicationContext對象注入。
下面是實現ApplicationContextAware接口方式的代碼,前面兩種方法類似:
public class SpringContextUtil implements ApplicationContextAware {
// Spring應用上下文環(huán)境
private static ApplicationContext applicationContext;
/**
* 實現ApplicationContextAware接口的回調方法。設置上下文環(huán)境
*
* @param applicationContext
*/
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextUtil.applicationContext = applicationContext;
}
/**
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 獲取對象
*
* @param name
* @return Object
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
}
盡管,spring提供的后三種方法能夠實如今普通的類中繼承或實現對應的類或接口來獲取spring 的ApplicationContext對象,可是在使用是一定要注意實現了這些類或接口的普通java類一定要在Spring 的配置文件applicationContext.xml文件里進行配置。否則獲取的ApplicationContext對象將為null。
方法六:通過Spring提供的ContextLoader
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); wac.getBean(beanID);
最后提供一種不依賴于servlet,不須要注入的方式??墒琼氁⒁庖稽c,在server啟動時。Spring容器初始化時,不能通過下面方法獲取Spring 容器,細節(jié)能夠查看spring源代碼org.springframework.web.context.ContextLoader。
JUNIT測試時ContextLoader.getCurrentWebApplicationContext()=NULL
在JUNIT測試方法中加入以下代碼,正式環(huán)境不用
MockServletContext sc = new MockServletContext("");
sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, "/applicationContext.xml");
ServletContextListener listener = new ContextLoaderListener();
ServletContextEvent event = new ServletContextEvent(sc);
listener.contextInitialized(event);
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
基于springboot i18n國際化后臺多種語言設置的方式
這篇文章主要介紹了基于springboot i18n國際化后臺多種語言設置的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
IntelliJ IDEA自定義代碼提示模板Live Templates的圖文教程
這篇文章主要介紹了IntelliJ IDEA自定義代碼提示模板Live Templates,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
SpringCloud2020整合Nacos-Bootstrap配置不生效的解決
這篇文章主要介紹了SpringCloud2020整合Nacos-Bootstrap配置不生效的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
idea一鍵部署SpringBoot項目jar包到服務器的實現
我們在開發(fā)環(huán)境部署項目一般通過idea將項目打包成jar包,然后連接linux服務器,將jar手動上傳到服務中,本文就來詳細的介紹一下步驟,感興趣的可以了解一下2023-12-12

