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

