普通對(duì)象使用spring容器中的對(duì)象的實(shí)現(xiàn)方法
引語:
工作中有時(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);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis實(shí)現(xiàn)表連接查詢寫法(三種對(duì)應(yīng)關(guān)系)的方法總結(jié)
這篇文章主要介紹了MyBatis實(shí)現(xiàn)表連接查詢寫法(一對(duì)一關(guān)系、一對(duì)多關(guān)系、多對(duì)多關(guān)系)的方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-01-01java sql ResultSet 之getRow()用法說明
這篇文章主要介紹了java sql ResultSet 之getRow()用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08Java數(shù)組與堆棧相關(guān)知識(shí)總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java數(shù)組與堆棧展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Springcloud Stream消息驅(qū)動(dòng)工具使用介紹
SpringCloud Stream由一個(gè)中間件中立的核組成,應(yīng)用通過SpringCloud Stream插入的input(相當(dāng)于消費(fèi)者consumer,它是從隊(duì)列中接收消息的)和output(相當(dāng)于生產(chǎn)者producer,它是發(fā)送消息到隊(duì)列中的)通道與外界交流2022-09-09SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能
本文介紹SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能,通過上傳接口,可在C盤的tempfile目錄下找到上傳的文件,預(yù)覽時(shí)會(huì)在同級(jí)目錄下創(chuàng)建一個(gè)相同文件名后綴為pdf的文件,每次預(yù)覽會(huì)先查找文件是否存在,存在則直接預(yù)覽,不存在則會(huì)走上面的處理,需要的朋友可以參考下2022-02-02使用spring-data-redis中的Redis事務(wù)
這篇文章主要介紹了使用spring-data-redis中的Redis事務(wù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07SpringCloud Eureka實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)
Eureka是一種基于REST(具像狀態(tài)傳輸)的服務(wù),主要用于AWS云中定位服務(wù),以實(shí)現(xiàn)中間層服務(wù)器的負(fù)載平衡和故障轉(zhuǎn)移。本文記錄一個(gè)簡(jiǎn)單的服務(wù)注冊(cè)與發(fā)現(xiàn)實(shí)例。感興趣的小伙伴們可以參考一下2019-01-01