Spring在代碼中獲取bean的幾種方式詳解
方法如下
- 方法一:通過(guò)讀取XML文件反射生成對(duì)象
- 方法二:通過(guò)Spring提供的utils類(lèi)獲取ApplicationContext對(duì)象
- 方法三:繼承自抽象類(lèi)ApplicationObjectSupport
- 方法四:繼承自抽象類(lèi)WebApplicationObjectSupport
- 方法五:實(shí)現(xiàn)接口ApplicationContextAware
- 方法六:通過(guò)Spring提供的ContextLoader
獲取spring中bean的方式總結(jié):
方法一:通過(guò)讀取XML文件反射生成對(duì)象
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("userService");//比如:<bean id="userService" class="com.cloud.service.impl.UserServiceImpl"></bean>
說(shuō)明:這樣的方式適用于採(cǎi)用Spring框架的獨(dú)立應(yīng)用程序,須要程序通過(guò)配置文件手工初始化Spring的情況。
方法二:通過(guò)Spring提供的工具類(lèi)獲取ApplicationContext對(duì)象
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
說(shuō)明:這樣的方式適合于Spring框架的B/S系統(tǒng),通過(guò)ServletContext對(duì)象獲取ApplicationContext對(duì)象。然后在通過(guò)它獲取須要的類(lèi)實(shí)例。上面兩個(gè)工具方式的差別是,前者在獲取失敗時(shí)拋出異常。后者返回null。
方法三:繼承自抽象類(lèi)ApplicationObjectSupport
說(shuō)明:抽象類(lèi)ApplicationObjectSupport提供getApplicationContext()方法。能夠方便的獲取ApplicationContext。
Spring初始化時(shí)。會(huì)通過(guò)該抽象類(lèi)的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對(duì)象注入。
方法四:繼承自抽象類(lèi)WebApplicationObjectSupport
說(shuō)明:類(lèi)似上面方法。調(diào)用getWebApplicationContext()獲取WebApplicationContext
方法五:實(shí)現(xiàn)接口ApplicationContextAware
說(shuō)明:實(shí)現(xiàn)該接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 對(duì)象。Spring初始化時(shí),會(huì)通過(guò)該方法將ApplicationContext對(duì)象注入。
下面是實(shí)現(xiàn)ApplicationContextAware接口方式的代碼,前面兩種方法類(lèi)似:
public class SpringContextUtil implements ApplicationContextAware {
// Spring應(yīng)用上下文環(huán)境
private static ApplicationContext applicationContext;
/**
* 實(shí)現(xiàn)ApplicationContextAware接口的回調(diào)方法。設(shè)置上下文環(huán)境
*
* @param applicationContext
*/
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextUtil.applicationContext = applicationContext;
}
/**
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 獲取對(duì)象
*
* @param name
* @return Object
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
}
盡管,spring提供的后三種方法能夠?qū)嵢缃衿胀ǖ念?lèi)中繼承或?qū)崿F(xiàn)對(duì)應(yīng)的類(lèi)或接口來(lái)獲取spring 的ApplicationContext對(duì)象,可是在使用是一定要注意實(shí)現(xiàn)了這些類(lèi)或接口的普通java類(lèi)一定要在Spring 的配置文件applicationContext.xml文件里進(jìn)行配置。否則獲取的ApplicationContext對(duì)象將為null。
方法六:通過(guò)Spring提供的ContextLoader
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); wac.getBean(beanID);
最后提供一種不依賴(lài)于servlet,不須要注入的方式??墒琼氁⒁庖稽c(diǎn),在server啟動(dòng)時(shí)。Spring容器初始化時(shí),不能通過(guò)下面方法獲取Spring 容器,細(xì)節(jié)能夠查看spring源代碼org.springframework.web.context.ContextLoader。
JUNIT測(cè)試時(shí)ContextLoader.getCurrentWebApplicationContext()=NULL
在JUNIT測(cè)試方法中加入以下代碼,正式環(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);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot集成sensitive-word實(shí)現(xiàn)敏感詞過(guò)濾的兩種方案
敏感詞過(guò)濾通常是指從文本中檢測(cè)并移除或替換掉被認(rèn)為是不適當(dāng)、冒犯性或違反特定社區(qū)準(zhǔn)則的詞匯,這篇文章主要介紹了springboot集成sensitive-word實(shí)現(xiàn)敏感詞過(guò)濾,需要的朋友可以參考下2024-08-08
java如何將實(shí)體類(lèi)轉(zhuǎn)換成json并在控制臺(tái)輸出
這篇文章主要介紹了java如何將實(shí)體類(lèi)轉(zhuǎn)換成json并在控制臺(tái)輸出問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
基于Java設(shè)計(jì)一個(gè)高并發(fā)的秒殺系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Java設(shè)計(jì)一個(gè)高并發(fā)的秒殺系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2023-10-10
在springboot中注入FilterRegistrationBean不生效的原因
這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
springboot業(yè)務(wù)功能實(shí)戰(zhàn)之告別輪詢(xún)websocket的集成使用
WebSocket使得客戶(hù)端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶(hù)端推送數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于springboot業(yè)務(wù)功能實(shí)戰(zhàn)之告別輪詢(xún)websocket的集成使用,需要的朋友可以參考下2022-10-10
Java實(shí)現(xiàn)單向鏈表反轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)單向鏈表反轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Mybatis-plus出現(xiàn)數(shù)據(jù)庫(kù)id很大或者為負(fù)數(shù)的解決
本文主要介紹了Mybatis-plus出現(xiàn)數(shù)據(jù)庫(kù)id很大或者為負(fù)數(shù)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
淺談Java編程ToString()方法重寫(xiě)的意義
這篇文章主要介紹了淺談Java編程ToString()方法重寫(xiě)的意義,還是挺不錯(cuò)的,這里分享給大家,供朋友們學(xué)習(xí)和參考。2017-10-10

