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

簡(jiǎn)單理解Spring之IOC和AOP及代碼示例

 更新時(shí)間:2017年12月05日 10:50:13   作者:kite___  
這篇文章主要介紹了簡(jiǎn)單理解Spring之IOC和AOP及代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。

Spring是一個(gè)開(kāi)源框架,主要實(shí)現(xiàn)兩件事,IOC(控制反轉(zhuǎn))和AOP(面向切面編程)。

IOC

控制反轉(zhuǎn),也可以稱(chēng)為依賴(lài)倒置。

所謂依賴(lài),從程序的角度看,就是比如A要調(diào)用B的方法,那么A就依賴(lài)于B,反正A要用到B,則A依賴(lài)于B。所謂倒置,你必須理解如果不倒置,會(huì)怎么著,因?yàn)锳必須要有B,才可以調(diào)用B,如果不倒置,意思就是A主動(dòng)獲取B的實(shí)例:Bb=newB(),這就是最簡(jiǎn)單的獲取B實(shí)例的方法(當(dāng)然還有各種設(shè)計(jì)模式可以幫助你去獲得B的實(shí)例,比如工廠、Locator等等),然后你就可以調(diào)用b對(duì)象了。所以,不倒置,意味著A要主動(dòng)獲取B,才能使用B;到了這里,就應(yīng)該明白了倒置的意思了。倒置就是A要調(diào)用B的話,A并不需要主動(dòng)獲取B,而是由其它人自動(dòng)將B送上門(mén)來(lái)。

所謂控制反轉(zhuǎn),就是控制權(quán)的轉(zhuǎn)移,舉例說(shuō)明:一個(gè)人要開(kāi)車(chē),正常情況下,人應(yīng)該自己去找車(chē),而實(shí)現(xiàn)控制反轉(zhuǎn)后,人就不需要考慮車(chē)從哪里來(lái)了,直接開(kāi)就行了,人就把找車(chē)的控制權(quán)轉(zhuǎn)移給了別的對(duì)象。體會(huì)一下下面的代碼

先定義一個(gè)接口Car

public interface Car {
  void go();
}

定義兩種車(chē)

public class Benz implements Car {

  public void go() {
    System.out.println("benz go......");
  }
}

public class BMW implements Car{

  public void go() {
    System.out.println("bmw go......");
  }
}

下面是人開(kāi)車(chē)

public class Person {

  Car car=new Benz();

  void DriveCar(){
    System.out.println("begin drive");
    car.go();
  }
}

這是正常的代碼控制流程,人想要開(kāi)車(chē),就要自己去實(shí)例化一輛車(chē)。但是,這樣子的話,這個(gè)人就只能開(kāi)一種車(chē)。怎么樣才能讓這個(gè)人能開(kāi)各種車(chē)呢,就是要實(shí)現(xiàn)控制反轉(zhuǎn),也就是說(shuō),人不再去自己實(shí)例化車(chē)了,那人怎樣得到車(chē)的對(duì)象呢?我們可以通過(guò)依賴(lài)注入(Dependency Injection,簡(jiǎn)稱(chēng)DI)的方式來(lái)讓人得到車(chē)的對(duì)象,從而實(shí)現(xiàn)控制反轉(zhuǎn)。所以,我們要修改Person類(lèi)

public class Person {

  Car car=null;
  public Person(Car car){
    this.car=car;
  }

  void driveCar(){
    System.out.println("begin drive");
    car.go();
  }
}

現(xiàn)在的Person類(lèi)已經(jīng)不自己實(shí)例化車(chē)的對(duì)象了,而是通過(guò)構(gòu)造函數(shù)來(lái)獲得車(chē)的對(duì)象,所以,這個(gè)類(lèi)就可以開(kāi)各種車(chē)了,只要這個(gè)車(chē)實(shí)現(xiàn)了Car接口就可以??匆幌氯绾问褂肞erson類(lèi)

public static void main(String[] args) {
  Person p=new Person(new Benz());
  p.driveCar();
}

現(xiàn)在的Person類(lèi)可以開(kāi)不止一種車(chē),只要你通過(guò)構(gòu)造函數(shù)傳遞進(jìn)來(lái)。在這個(gè)例子中,Car對(duì)象就是Person類(lèi)的依賴(lài),當(dāng)我們實(shí)例化Person類(lèi)時(shí),將一個(gè)Car的實(shí)例傳遞給Person類(lèi),就是依賴(lài)注入,我們的Person類(lèi)從而實(shí)現(xiàn)了控制反轉(zhuǎn)。

控制反轉(zhuǎn)到底反轉(zhuǎn)了什么?有種說(shuō)法是這樣的:所謂控制反轉(zhuǎn),反轉(zhuǎn)的是獲取對(duì)象依賴(lài)的過(guò)程。控制權(quán)反轉(zhuǎn)后,獲取依賴(lài)對(duì)象的過(guò)程由自身管理變?yōu)橛蒊OC容器注入。

Spring實(shí)現(xiàn)依賴(lài)注入的方式

在上面的這行代碼中Person p=new Person(new Benz());,我們通過(guò)手動(dòng)的方式new了一個(gè)Benz()的對(duì)象,然后將其注入到Person類(lèi)中。而Spring不這么干,因?yàn)镾pring覺(jué)得,你這行代碼實(shí)例化了一個(gè)具體的Benz類(lèi),如果你以后想要在這里實(shí)例化一個(gè)BMW類(lèi)的話,豈不是要修改代碼?那我干脆寫(xiě)到配置文件里好了,即便你將來(lái)要該注意,至少不需要修改代碼,于是就有了下面的配置

<beans>
  <bean id="car" class="com.XXX.Benz" />
  <bean id="person" class="com.XXX.Person" >
    <property name="car" ref="car" />
  <bean/>
</beans>

然后,Spring再提供一些機(jī)制,從配置文件中獲取Person類(lèi)的對(duì)象時(shí),它所以來(lái)的car對(duì)象會(huì)被裝配進(jìn)來(lái),而person對(duì)象不需要關(guān)心到底是哪個(gè)具體的類(lèi)被傳遞進(jìn)來(lái)了。所以,Spring作為一個(gè)IOC框架主要做了兩步:創(chuàng)建對(duì)象和組裝對(duì)象之間的關(guān)系。

AOP

AOP(Aspect Oriented Programming)是面向切面編程,下面我來(lái)舉例說(shuō)明什么是切面。在一個(gè)完整的網(wǎng)站項(xiàng)目中,很多模塊都需要做日志記錄,很多地方都需要做登錄判斷,很多地方都需要做異常處理。日志記錄,登錄判斷,異常處理等這些邏輯,就是所謂的切面。假設(shè)我將這些切面的邏輯寫(xiě)得到處都是,那么代碼的可維護(hù)性就可想而知了。AOP就是為了實(shí)現(xiàn)關(guān)注點(diǎn)分離,將這些切面的邏輯抽出來(lái)寫(xiě)到單獨(dú)的類(lèi)中,然后再想辦法將他們與一般的模塊組裝到一塊來(lái)執(zhí)行,普通模塊甚至都不知道他們已經(jīng)和切面組裝到一塊了。

 面向切面編程的目標(biāo)就是分離關(guān)注點(diǎn)。什么是關(guān)注點(diǎn)呢?就是你要做的事,就是關(guān)注點(diǎn)。假如你是個(gè)公子哥,沒(méi)啥人生目標(biāo),天天就是衣來(lái)伸手,飯來(lái)張口,整天只知道玩一件事!那么,每天你一睜眼,就光想著吃完飯就去玩(你必須要做的事),但是在玩之前,你還需要穿衣服、穿鞋子、疊好被子、做飯等等等等事情,這些事情就是你的關(guān)注點(diǎn),但是你只想吃飯然后玩,那么怎么辦呢?這些事情通通交給別人去干。在你走到飯桌之前,有一個(gè)專(zhuān)門(mén)的仆人A幫你穿衣服,仆人B幫你穿鞋子,仆人C幫你疊好被子,仆人C幫你做飯,然后你就開(kāi)始吃飯、去玩(這就是你一天的正事),你干完你的正事之后,回來(lái),然后一系列仆人又開(kāi)始幫你干這個(gè)干那個(gè),然后一天就結(jié)束了!

AOP的好處就是你只需要干你的正事,其它事情別人幫你干。也許有一天,你想裸奔,不想穿衣服,那么你把仆人A解雇就是了!也許有一天,出門(mén)之前你還想帶點(diǎn)錢(qián),那么你再雇一個(gè)仆人D專(zhuān)門(mén)幫你干取錢(qián)的活!這就是AOP。每個(gè)人各司其職,靈活組合,達(dá)到一種可配置的、可插拔的程序結(jié)構(gòu)。

從Spring的角度看,AOP最大的用途就在于提供了事務(wù)管理的能力。事務(wù)管理就是一個(gè)關(guān)注點(diǎn),你的正事就是去訪問(wèn)數(shù)據(jù)庫(kù),而你不想管事務(wù)(太煩),所以,Spring在你訪問(wèn)數(shù)據(jù)庫(kù)之前,自動(dòng)幫你開(kāi)啟事務(wù),當(dāng)你訪問(wèn)數(shù)據(jù)庫(kù)結(jié)束之后,自動(dòng)幫你提交/回滾事務(wù)!

看下面的代碼,看不懂沒(méi)關(guān)系

<bean id="audience" class="com.springinaction.springidol.Audience" />
<aop:config>
 <aop:aspect ref="audience">
  <aop:pointcut id="performance" expression=
    "execution(* com.springinaction.springidol.Performer.perform(..))" 
    />

  <aop:before 
    pointcut-ref="performance"
    method="takeSeats" /> <!--<co id="co_refPointcut"/>-->
  <aop:before 
    pointcut-ref="performance"
    method="turnOffCellPhones" /> <!--<co id="co_refPointcut"/>-->
  <aop:after-returning
    pointcut-ref="performance" 
    method="applaud" /> <!--<co id="co_refPointcut"/>-->
  <aop:after-throwing 
    pointcut-ref="performance" 
    method="demandRefund" /> <!--<co id="co_refPointcut"/>-->
 </aop:aspect>
</aop:config>

上面配置的大概意思是,當(dāng)Performer.perform方法將要發(fā)生時(shí),Spring框架中的代理會(huì)將目標(biāo)方法(Performer.perform())攔截下來(lái),執(zhí)行目標(biāo)方法前先執(zhí)行Audience.takeSeats()和Audienceturn.OffCellPhones()方法,然后運(yùn)行目標(biāo)方法,當(dāng)目標(biāo)方法執(zhí)行完畢返回時(shí),再運(yùn)行Audienceturn.applaud()方法。如果目標(biāo)方法不幸拋出了異常,代理會(huì)運(yùn)行Audienceturn.demandRefund()方法??傊?,Spring的代理類(lèi)全方位地監(jiān)控了目標(biāo)方法的執(zhí)行,而目標(biāo)方法只專(zhuān)注于自己的事情,甚至都不知道代理類(lèi)的存在。

總結(jié)

以上就是本文關(guān)于簡(jiǎn)單理解Spring之IOC和AOP及代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

Spring的Ioc模擬實(shí)現(xiàn)詳細(xì)介紹

Spring AOP攔截-三種方式實(shí)現(xiàn)自動(dòng)代理詳解

如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • 剖析Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化

    剖析Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化

    這篇文章主要介紹了Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化,文中以Java 8后HashMap的性能提升來(lái)討論了HashMap的一些優(yōu)化點(diǎn),需要的朋友可以參考下
    2016-05-05
  • Java之Arrays的各種功能和用法總結(jié)

    Java之Arrays的各種功能和用法總結(jié)

    數(shù)組在?Java?中是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和操作大量數(shù)據(jù)。Arrays?是我們?cè)谔幚頂?shù)組時(shí)的一把利器。它提供了豐富的方法和功能,使得數(shù)組操作變得更加簡(jiǎn)單、高效和可靠。接下來(lái)我們一起看看?Arrays?的各種功能和用法,,需要的朋友可以參考下
    2023-05-05
  • SpringBoot+vue+Axios實(shí)現(xiàn)Token令牌的詳細(xì)過(guò)程

    SpringBoot+vue+Axios實(shí)現(xiàn)Token令牌的詳細(xì)過(guò)程

    Token是在服務(wù)端產(chǎn)生的,前端可以使用用戶(hù)名/密碼向服務(wù)端請(qǐng)求認(rèn)證(登錄),服務(wù)端認(rèn)證成功,服務(wù)端會(huì)返回?Token?給前端,Token可以使用自己的算法自定義,本文給大家介紹SpringBoot+vue+Axios實(shí)現(xiàn)Token令牌,感興趣的朋友一起看看吧
    2023-10-10
  • idea 離線安裝lombok插件的方法步驟(圖文)

    idea 離線安裝lombok插件的方法步驟(圖文)

    這篇文章主要介紹了idea 離線安裝lombok插件的方法步驟(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流

    SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流

    這篇文章主要介紹了SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot集成RocketMQ的使用示例

    SpringBoot集成RocketMQ的使用示例

    RocketMQ是阿里巴巴開(kāi)源的一款消息中間件,性能優(yōu)秀,功能齊全,被廣泛應(yīng)用在各種業(yè)務(wù)場(chǎng)景,本文就來(lái)介紹一下SpringBoot集成RocketMQ的使用示例,感興趣的可以了解一下
    2023-11-11
  • 詳解Java如何實(shí)現(xiàn)自定義注解

    詳解Java如何實(shí)現(xiàn)自定義注解

    注解(Annotation),也叫元數(shù)據(jù)。一種代碼級(jí)別的說(shuō)明。它是JDK1.5及以后版本引入的一個(gè)特性,與類(lèi)、接口、枚舉是在同一個(gè)層次。本文將通過(guò)示例詳解Java如何實(shí)現(xiàn)自定義注解,需要的可以參考一下
    2022-06-06
  • java開(kāi)發(fā)ExecutorService監(jiān)控實(shí)現(xiàn)示例詳解

    java開(kāi)發(fā)ExecutorService監(jiān)控實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了java開(kāi)發(fā)ExecutorService監(jiān)控實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 一種求正整數(shù)冪的高效算法詳解

    一種求正整數(shù)冪的高效算法詳解

    本篇文章是對(duì)java中一種求正整數(shù)冪的高效算法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 分析Java中為什么String不可變

    分析Java中為什么String不可變

    Java中為什么String是不可變性的。今天我們從多角度解析為什么Java把String做成不可變的。
    2021-06-06

最新評(píng)論

九寨沟县| 泌阳县| 溧阳市| 永安市| 莫力| 平利县| 呼玛县| 黄山市| 金秀| 仪陇县| 西乌| 固始县| 江达县| 乌拉特后旗| 明星| 义乌市| 晋江市| 灵山县| 洛川县| 玉山县| 禹州市| 汤原县| 八宿县| 塔河县| 准格尔旗| 马尔康县| 友谊县| 和静县| 彭州市| 康定县| 台前县| 嘉黎县| 迁安市| 遂宁市| 乌审旗| 景泰县| 五华县| 眉山市| 乌什县| 武鸣县| 林口县|