<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在實際的系統應用開發中我經常會遇到這樣的一類需求,相信大家在工作中也會經常遇到:
同一個系統在多個省份部署。
一個業務在北京是一種實現方式,是基於北京使用者的需求。
同樣的業務在上海是另外一種實現方式,與北京的實現方式大同小異
遇到這樣的需求,我們通常會定義一個業務實現的介面,比如:
public interface IDemoService { public void doSomething(); }
在北京環境下這樣實現,比如:
@Component public class DemoServiceBeijing implements IDemoService { @Override public void doSomething() {System.out.println("北京的業務實現");} }
在上海環境下這樣實現,比如:
@Component public class DemoServiceShanghai implements IDemoService { @Override public void doSomething() {System.out.println("上海的業務實現");} }
然後我們寫一個模擬業務測試用例
@SpringBootTest class DemoApplicationTests { //這裡注入的demoService是DemoServiceShanghai,還是DemoServiceBeijing? @Resource IDemoService demoService; @Test void testDemoService() { demoService.doSomething(); } }
當我們執行這個測試用例的時候一定會報錯,因為Spring發現了兩個IDemoService的實現類。它不知道去範例化哪一個實現類,來作為IDemoService的實際業務處理bean。當然我們期望的狀態是:
在北京部署系統的時候,使用DemoServiceBeijing作為IDemoService的實現類完成依賴注入
在上海部署系統的時候,使用DemoServiceShanghai作為IDemoService的實現類完成依賴注入
面對上面的需求,先說幾個相對低階的解決方案,這幾個方案雖然可以實現我們期望的狀態,但是對運維不夠友好。
假如在北京部署系統的時候,在DemoServiceBeijing的類上面加上@Primary
,該註解的作用就是強迫從多個實現類裡面選一個實現類,如果Spring不知道選哪一個,我們告訴它一個預設的。
因為@Resource
註解預設使用名稱進行依賴注入,所以變數名明確叫做demoServiceBeijing(首字母小寫),使用的就是DemoServiceBeijing實現類。
@Resource IDemoService demoServiceBeijing; //這裡的變數名稱指定了bean名稱 //IDemoService demoService; 被替換掉
或者
@Resource(name = "demoServiceBeijing") //使用resource註解明確指定名稱 IDemoService demoService;
與上文同樣的道理,使用@Qualifier
註解,指定bean的名稱進行依賴注入
@Qualifier("demoServiceBeijing") //使用Qualifier註解明確指定名稱 @Resource IDemoService demoService;
上面所提到的三個方案雖然都可以解決:在不同的部署環境下使用不同的介面實現類完成依賴注入的問題。但是這樣不好,因為一旦我們要把部署環境從beijing(北京)換成shanghai(上海),就需要把上面的註解的位置或者內容全都修改一遍(所有的實現類程式碼都要修改)。
我們提出進一步的期望:就是隻修改一個設定就能完成部署環境切換的操作。比如:
deploy: province: beijing
當我們期望把部署環境從北京切換到上海的時候,只需要將上文設定中的beijing 改成 shanghai ,這該怎麼實現呢?
在北京的實現類上面加上ConditionalOnProperty註解,havingValue的值為beijing
@Component @ConditionalOnProperty(value="deploy.province",havingValue = "beijing") public class DemoServiceBeijing implements IDemoService {
在上海的實現類上面加上ConditionalOnProperty註解,havingValue的值為shanghai
@Component @ConditionalOnProperty(value="deploy.province",havingValue = "shanghai") public class DemoServiceShanghai implements IDemoService {
ConditionalOnProperty註解在這裡的作用就是:讀取組態檔發現deploy.province
,並將該設定的值與havingValue匹配,匹配上哪一個就範例化哪一個類作為該介面的實現類bean注入到Spring容器中(當然注入過程需要配合@Component
註解實現)
以上就是springboot介面多實現類選擇性注入解決方案的詳細內容,更多關於springboot介面多實現類選擇性注入的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45