本篇文章給大家分享的是有關(guān)怎么在普通對(duì)象中使用spring容器中的對(duì)象,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

成都創(chuàng)新互聯(lián)專注于丹徒網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供丹徒營銷型網(wǎng)站建設(shè),丹徒網(wǎng)站制作、丹徒網(wǎng)頁設(shè)計(jì)、丹徒網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造丹徒網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供丹徒網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
引語:
工作中有時(shí)候需要在普通的對(duì)象中去調(diào)用spring管理的對(duì)象,但是在普通的java對(duì)象直接使用@Autowired或者@Resource的時(shí)候會(huì)發(fā)現(xiàn)被注入的對(duì)象是null,會(huì)報(bào)空指針。我們可以簡(jiǎn)單的理解為spring是一個(gè)公司,它管理的對(duì)象就是它的員工,而普通的java對(duì)象是其他公司的員工,如果其他公司要找spring公司的員工一起共事沒有經(jīng)過spring公司的同意肯定是不行的。
解決方式:
方法一:如果這個(gè)普通對(duì)象可以被spring管理的話,最好是直接交給spring管理,這樣spring管理的bean中注入其他的bean是沒有問題的。
方法二:當(dāng)我們的普通對(duì)象沒有辦法交給spring管理的時(shí)候,我們可以創(chuàng)建一個(gè)公共的springBeanUtil專門為普通對(duì)象提供spring的員工(有點(diǎn)像spring公司的外包部門,把對(duì)象外包給其他公司使用,哈哈)。
@Service
public class SpringBeanUtil implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
applicationContext = context;
}
// 這里使用的是根據(jù)class類型來獲取bean 當(dāng)然你可以根據(jù)名稱或者其他之類的方法 主要是有applicationContext你想怎么弄都可以
public static Object getBeanByClass(Class clazz) {
return applicationContext.getBean(clazz);
}
}這個(gè)util呢,其實(shí)就是實(shí)現(xiàn)了ApplicationContextAware接口,有小伙伴要問了這個(gè)接口是干嘛的?這里給出鏈接地址,ApplicationContextAware參考資料。然后我也將文檔中的解釋給摘錄過來了
public interface ApplicationContextAware extends Aware
Interface to be implemented by any object that wishes to be notified of the ApplicationContext that it runs in.
Implementing this interface makes sense for example when an object requires access to a set of collaborating beans. Note that configuration via bean references is preferable to implementing this interface just for bean lookup purposes.
This interface can also be implemented if an object needs access to file resources, i.e. wants to call getResource, wants to publish an application event, or requires access to the MessageSource. However, it is preferable to implement the more specific ResourceLoaderAware, ApplicationEventPublisherAware or MessageSourceAware interface in such a specific scenario.
Note that file resource dependencies can also be exposed as bean properties of type Resource, populated via Strings with automatic type conversion by the bean factory. This removes the need for implementing any callback interface just for the purpose of accessing a specific file resource.
ApplicationObjectSupport is a convenience base class for application objects, implementing this interface.
大概意思就是說只要實(shí)現(xiàn)了ApplicationContextAware接口的類,期望被告知當(dāng)前運(yùn)行的applicationContext是什么。然后又說了如果是想要獲取資源最好是用ResourceLoaderAware, ApplicationEventPublisherAware or MessageSourceAware 這幾個(gè)接口,最后還來了一句我們知道你們要使用這些接口,所以我們幫你弄了一個(gè)實(shí)現(xiàn)了這些接口的抽象類ApplicationObjectSupport(在spring-context的jar包中)。這里說得很清楚要使用bean的話,實(shí)現(xiàn)ApplicationContextAware,因?yàn)槲覀冞@里不需要使用靜態(tài)資源之類的所以我們就不用spring為我們提供的ApplicationObjectSupport了,有興趣的可以自己研究下。
我們這里簡(jiǎn)單的看一下ApplicationContextAware類里面都有啥?
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
發(fā)現(xiàn)就一個(gè)方法,spring初始化的時(shí)候會(huì)將當(dāng)前的applicationContext傳給ApplicationContextAware的setApplicationContext方法,所以只要實(shí)現(xiàn)類將這個(gè)applicationContext拿到了,就可以通過class類型或者class的名稱來獲取到spring中的bean了。原理其實(shí)很簡(jiǎn)單吧。使用的時(shí)候我們可以調(diào)用spring中的bean。如下:
Test test = (Test) SpringBeanUtil.getBeanByClass(Test.class);
以上就是怎么在普通對(duì)象中使用spring容器中的對(duì)象,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
標(biāo)題名稱:怎么在普通對(duì)象中使用spring容器中的對(duì)象
URL標(biāo)題:http://chinadenli.net/article18/ppcodp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、品牌網(wǎng)站制作、靜態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、軟件開發(fā)、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)