Spring高階用法之自定義業(yè)務(wù)對(duì)象組件化
若干年前在使用SpringMVC的時(shí)候,發(fā)現(xiàn)springMVC可以把HttpSession,HttpRequest組件化注入:
@Autowired HttpSession session; @Autowired HttpRequest httpRequest;
于是花了30分鐘追蹤了相關(guān)的源代碼徹底摸清其原理,并且決定將用戶(User/Principle)也組件化(盡管當(dāng)時(shí)工作處于極其忙碌的狀態(tài),也忍不住去研究)。
方法如下:
1. 定義IPrincipal(IUser)接口
interface IPrincipal extends Serializable {
IPrincipal get()
}
2. 實(shí)現(xiàn)PrincipalObjectFactory
class PrincipalObjectFactory implements ObjectFactory<IPrincipal>, Serializable {
@Override
IPrincipal getObject() {
def requestAttr = RequestContextHolder.currentRequestAttributes()
def request = requestAttr.getRequest()
def p = new PrincipalHelper(request).get()
new IPrincipal() {
@Override
IPrincipal get() {
p
}
}
}
}
3. 在spring的上下文中注冊(cè)依賴處理器
beanFactory.registerResolvableDependency(IPrincipal, new PrincipalObjectFactory())
只需要以上步驟,即可使用@Autowired在業(yè)務(wù)代碼中注入IPrincipal(IUser),并且保證其線程安全。
原理:
閱讀spring源碼會(huì)發(fā)現(xiàn),spring在注入接口時(shí)如果發(fā)現(xiàn)沒有接口的實(shí)現(xiàn)類,就會(huì)從ResolvableDependency中尋找相關(guān)的依賴解決器。
如果注冊(cè)了相關(guān)的依賴解決器,會(huì)給此接口注入一個(gè)代理類,這個(gè)代理類的target就是ObjectFactory#getObject,在這里就可實(shí)現(xiàn)你的IPrincipal(IUser)獲取了。
總結(jié)
1 使用這個(gè)方式將IPrincipal(IUser)組件化,而不是通過工具類的方式去獲取。這樣的方式充分體現(xiàn)了spring的依賴注入的思想,并且系統(tǒng)耦合性也降低不少。
2 即使在spring上下文中注入ObjectFactory,spring并不會(huì)自動(dòng)注冊(cè),需要手動(dòng)注冊(cè)。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺談SpringBoot是如何實(shí)現(xiàn)日志的
- SpringCloud分布式鏈路跟蹤的方法
- 詳解Spring框架下向異步線程傳遞HttpServletRequest參數(shù)的坑
- 使用dockercompose搭建springboot-mysql-nginx應(yīng)用
- 使用Docker部署Spring Boot的方法示例
- Spring Boot 2.X優(yōu)雅的解決跨域問題
- SpringBoot記錄Http請(qǐng)求日志的方法
- 詳解用JWT對(duì)SpringCloud進(jìn)行認(rèn)證和鑒權(quán)
- Springboot 配置RabbitMQ文檔的方法步驟
- Spring自帶的校驗(yàn)框架Validation的使用實(shí)例
相關(guān)文章
Java利用ElasticSearch實(shí)現(xiàn)自動(dòng)補(bǔ)全功能
這篇文章主要為大家詳細(xì)介紹了Java如何利用ElasticSearch實(shí)現(xiàn)跟谷歌和百度類似的下拉補(bǔ)全提示功能,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-08-08
JVM 方法調(diào)用之動(dòng)態(tài)分派(詳解)
下面小編就為大家?guī)硪黄狫VM 方法調(diào)用之動(dòng)態(tài)分派(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
java正則表達(dá)式學(xué)習(xí)筆記之命名捕獲
這篇文章主要為大家詳細(xì)介紹了java正則表達(dá)式中的命名捕獲,感興趣的小伙伴們可以參考一下2016-02-02
Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
使用SpringBoot中的Schedule定時(shí)發(fā)送郵件的方法
在SpringBoot中,你可以使用@Scheduled注解來創(chuàng)建定時(shí)任務(wù),@Scheduled注解可以應(yīng)用于方法上,表示這個(gè)方法是一個(gè)定時(shí)任務(wù),可以根據(jù)指定的時(shí)間間隔或固定時(shí)間執(zhí)行,本文就給大家介紹一下如何使用SpringBoot中的Schedule定時(shí)發(fā)送郵件,需要的朋友可以參考下2023-08-08
java創(chuàng)建多級(jí)目錄文件的實(shí)例講解
下面小編就為大家分享一篇java創(chuàng)建多級(jí)目錄文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
SpringBoot不讀取bootstrap.yml/properties文件問題
這篇文章主要介紹了SpringBoot不讀取bootstrap.yml/properties文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

