最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析springboot通過(guò)面向接口編程對(duì)控制反轉(zhuǎn)IOC的理解

 更新時(shí)間:2020年08月22日 08:34:24   作者:張占嶺  
這篇文章主要介紹了springboot通過(guò)面向接口編程對(duì)控制反轉(zhuǎn)IOC的理解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

IoC是什么

  Ioc—Inversion of Control,即“控制反轉(zhuǎn)”,不是什么技術(shù),而是一種設(shè)計(jì)思想。在Java開(kāi)發(fā)中,Ioc意味著將你設(shè)計(jì)好的對(duì)象交給容器控制,而不是傳統(tǒng)的在你的對(duì)象內(nèi)部直接控制。如何理解好Ioc呢?理解好Ioc的關(guān)鍵是要明確“誰(shuí)控制誰(shuí),控制什么,為何是反轉(zhuǎn)(有反轉(zhuǎn)就應(yīng)該有正轉(zhuǎn)了),哪些方面反轉(zhuǎn)了”,那我們來(lái)深入分析一下:

  ●誰(shuí)控制誰(shuí),控制什么:傳統(tǒng)Java SE程序設(shè)計(jì),我們直接在對(duì)象內(nèi)部通過(guò)new進(jìn)行創(chuàng)建對(duì)象,是程序主動(dòng)去創(chuàng)建依賴對(duì)象;而IoC是有專門一個(gè)容器來(lái)創(chuàng)建這些對(duì)象,即由Ioc容器來(lái)控制對(duì) 象的創(chuàng)建;誰(shuí)控制誰(shuí)?當(dāng)然是IoC 容器控制了對(duì)象;控制什么?那就是主要控制了外部資源獲?。ú恢皇菍?duì)象包括比如文件等)。

  ●為何是反轉(zhuǎn),哪些方面反轉(zhuǎn)了:有反轉(zhuǎn)就有正轉(zhuǎn),傳統(tǒng)應(yīng)用程序是由我們自己在對(duì)象中主動(dòng)控制去直接獲取依賴對(duì)象,也就是正轉(zhuǎn);而反轉(zhuǎn)則是由容器來(lái)幫忙創(chuàng)建及注入依賴對(duì)象;為何是反轉(zhuǎn)?因?yàn)橛扇萜鲙臀覀儾檎壹白⑷胍蕾噷?duì)象,對(duì)象只是被動(dòng)的接受依賴對(duì)象,所以是反轉(zhuǎn);哪些方面反轉(zhuǎn)了?依賴對(duì)象的獲取被反轉(zhuǎn)了。

IoC能做什么

  IoC 不是一種技術(shù),只是一種思想,一個(gè)重要的面向?qū)ο缶幊痰姆▌t,它能指導(dǎo)我們?nèi)绾卧O(shè)計(jì)出松耦合、更優(yōu)良的程序。傳統(tǒng)應(yīng)用程序都是由我們?cè)陬悆?nèi)部主動(dòng)創(chuàng)建依賴對(duì)象,從而導(dǎo)致類與類之間高耦合,難于測(cè)試;有了IoC容器后,把創(chuàng)建和查找依賴對(duì)象的控制權(quán)交給了容器,由容器進(jìn)行注入組合對(duì)象,所以對(duì)象與對(duì)象之間是 松散耦合,這樣也方便測(cè)試,利于功能復(fù)用,更重要的是使得程序的整個(gè)體系結(jié)構(gòu)變得非常靈活。

  其實(shí)IoC對(duì)編程帶來(lái)的最大改變不是從代碼上,而是從思想上,發(fā)生了“主從換位”的變化。應(yīng)用程序原本是老大,要獲取什么資源都是主動(dòng)出擊,但是在IoC/DI思想中,應(yīng)用程序就變成被動(dòng)的了,被動(dòng)的等待IoC容器來(lái)創(chuàng)建并注入它所需要的資源了。

  IoC很好的體現(xiàn)了面向?qū)ο笤O(shè)計(jì)法則之一—— 好萊塢法則:“別找我們,我們找你”;即由IoC容器幫對(duì)象找相應(yīng)的依賴對(duì)象并注入,而不是由對(duì)象主動(dòng)去找。

好了,正文開(kāi)始!

IOC,把控制反轉(zhuǎn)到業(yè)務(wù)端,這句話沒(méi)什么問(wèn)題,在springboot框架里,對(duì)象的管理是通過(guò)spring ioc來(lái)實(shí)現(xiàn)的,而開(kāi)發(fā)人員的開(kāi)發(fā)原則里總是說(shuō)“面向接口編程”,而為什么要面向接口卻沒(méi)幾個(gè)人能說(shuō)出來(lái),今天在寫一個(gè)基于redis的手動(dòng)分布鎖時(shí),對(duì)這個(gè)面向接口和控制反轉(zhuǎn)又有了一個(gè)體會(huì)。

底層代碼更需要面向接口

當(dāng)你為開(kāi)發(fā)人員提供一個(gè)封閉的包時(shí),他們是直接用的,他們不會(huì)修改你的代碼,當(dāng)然他們可以去繼承并擴(kuò)展;當(dāng)然如果你不希望被繼承可以聲明為final,這都是面向?qū)ο缶幊汤锾峁┖玫墓δ?,我們主要?code>控制反轉(zhuǎn)這句話,它把控制權(quán)交給了上層去實(shí)現(xiàn),底層通過(guò) 面向接口 的原則只設(shè)計(jì)一個(gè)規(guī)范,而又使用者去實(shí)現(xiàn);但框架功能里的細(xì)節(jié)是要有的,這類似于“模版方法”模式,底層框架實(shí)現(xiàn)了流程,而個(gè)性化的部分由上層去實(shí)現(xiàn)。

看jpa里的審計(jì)接口

public interface AuditorAware<T> {

	/**
	 * Returns the current auditor of the application.
	 *
	 * @return the current auditor
	 */
	Optional<T> getCurrentAuditor();
}

 

上面這個(gè)泛型接口只有一個(gè)方法,需要讓上層開(kāi)發(fā)人員根據(jù)自己的業(yè)務(wù)去實(shí)現(xiàn)它,比較返回一個(gè)當(dāng)前登陸的用戶實(shí)體,或者返回用戶名稱,然后底層框架里直接使用這個(gè)AuditorAware接口的對(duì)象;當(dāng)然如果你的底層只接收一個(gè)String類型的值,你也可以去派生一個(gè)個(gè)性化接口,讓上層開(kāi)發(fā)人員去實(shí)現(xiàn)你的接口即可。

/**
 * 返回用戶ID的標(biāo)識(shí)接口,由程序使用者去實(shí)現(xiàn).
 */
public interface UserIdAuditorAware extends AuditorAware<String> {

}

上面代碼更加準(zhǔn)確的規(guī)定了AuditorAware是一個(gè)字符串的接口,只返回用戶ID即可。

@Component
public class CurrentUserAware implements UserIdAuditorAware {
 @Autowired
 ApplicationContext applicationContext;

 @Override
 public Optional<String> getCurrentAuditor() {
  ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  HttpServletRequest request = requestAttributes.getRequest();
  return Optional.of(request.getSession().getAttribute("id").toString());
 }
}

我們的底層代碼會(huì)使用它的getCurrentAuditor()返回值 ,它是一個(gè)字符串。

public Object execute(String sourceId, Integer timeout, TimeUnit unit) {
  Assert.notNull(sourceId, "sourceId不能為空");
  String key = getKey(sourceId);
  String user = auditorAware.getCurrentAuditor().orElse(null);
  Assert.notNull(user, "AuditorAware實(shí)例返回的值為空");
  // 代碼略
}

對(duì)于一個(gè)小小的功能,我們?cè)诮?jīng)過(guò)思考之后,對(duì)于之前學(xué)過(guò)的東西進(jìn)行總結(jié),你可能會(huì)想法某種設(shè)計(jì)模式、某個(gè)算法、某個(gè)原則、在使用它們之后,讓你的代碼擴(kuò)展性更好,這種代碼也仿佛有了生命!

總結(jié)

到此這篇關(guān)于淺析springboot通過(guò)面向接口編程對(duì)控制反轉(zhuǎn)IOC的理解的文章就介紹到這了,更多相關(guān)springboot面向接口編程控制反轉(zhuǎn)IOC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • @Scheduled 如何讀取動(dòng)態(tài)配置文件

    @Scheduled 如何讀取動(dòng)態(tài)配置文件

    這篇文章主要介紹了@Scheduled 如何讀取動(dòng)態(tài)配置文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java實(shí)現(xiàn)八個(gè)常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序等

    Java實(shí)現(xiàn)八個(gè)常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序等

    這篇文章主要介紹了Java如何實(shí)現(xiàn)八個(gè)常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序 、快速排序、歸并排序、堆排序和LST基數(shù)排序,需要的朋友可以參考下
    2015-07-07
  • Elasticsearch配置文件選項(xiàng)作用詳解(es7)

    Elasticsearch配置文件選項(xiàng)作用詳解(es7)

    這篇文章主要為大家介紹了Elasticsearch配置文件選項(xiàng)作用詳解(es7),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Spring中的@Scheduled定時(shí)任務(wù)注解詳解

    Spring中的@Scheduled定時(shí)任務(wù)注解詳解

    這篇文章主要介紹了Spring中的@Scheduled定時(shí)任務(wù)注解詳解,要使用@Scheduled注解,首先需要在啟動(dòng)類添加@EnableScheduling,啟用Spring的計(jì)劃任務(wù)執(zhí)行功能,這樣可以在容器中的任何Spring管理的bean上檢測(cè)@Scheduled注解,執(zhí)行計(jì)劃任務(wù),需要的朋友可以參考下
    2023-09-09
  • 解讀ResultSet的遍歷方法

    解讀ResultSet的遍歷方法

    這篇文章主要介紹了ResultSet的遍歷方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java中定義Logger的三種常用方式介紹

    Java中定義Logger的三種常用方式介紹

    在 Java 開(kāi)發(fā)中,日志記錄是不可或缺的一部分,它幫助我們跟蹤程序的運(yùn)行狀態(tài)、調(diào)試問(wèn)題以及記錄重要信息本文將詳細(xì)介紹 Java 中定義 Logger 的三種方式,大家可以根據(jù)需求進(jìn)行選擇
    2025-03-03
  • gRPC實(shí)踐之proto及Maven插件概念及使用詳解

    gRPC實(shí)踐之proto及Maven插件概念及使用詳解

    這篇文章主要為大家介紹了gRPC實(shí)踐之proto及Maven插件概念及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)示例

    Java 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)示例

    Java動(dòng)態(tài)數(shù)組是一種可以任意伸縮數(shù)組長(zhǎng)度的對(duì)象,本文主要介紹了Java 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java使用云片API發(fā)送短信驗(yàn)證碼

    Java使用云片API發(fā)送短信驗(yàn)證碼

    這篇文章主要介紹了Java使用云片API發(fā)送短信驗(yàn)證碼,主要用的是Java實(shí)現(xiàn)短信驗(yàn)證碼。需要的朋友可以參考下
    2017-02-02
  • Mybatis之typeAlias配置的3種方式小結(jié)

    Mybatis之typeAlias配置的3種方式小結(jié)

    這篇文章主要介紹了Mybatis之typeAlias配置的3種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

弋阳县| 兖州市| 彭山县| 建宁县| 玉山县| 尖扎县| 卫辉市| 沅江市| 墨玉县| 绥化市| 吉木乃县| 邓州市| 米易县| 泸州市| 台东市| 两当县| 年辖:市辖区| 开原市| 鲜城| 上杭县| 尚义县| 水城县| 海盐县| 大关县| 崇仁县| 阜康市| 迁安市| 大荔县| 黎平县| 大兴区| 德惠市| 宁化县| 长沙县| 台东市| 饶河县| 海阳市| 陆良县| 西畴县| 安乡县| 威海市| 嘉禾县|