Spring的IOC和AOP

學習Spring框架:

??? 1.理解“控制反轉“

??????? 控制反轉,也稱為依賴注入,是面向對象編程中的一種設計理念,用來降低程序代碼之間的耦合度。

?????? 程序的耦合:

??????????? 調用者與被調用者的依賴關系

?????? 比如:程序員A負責編寫A類,程序員B負責B類開發,A類的某些功能需要實例化B類的對象調用其方法才能完成,那么A類就依賴B類,如果程序員B不寫B類 難道程序員A要一直等下去嗎?

??????????? 企業開發的原則:

??????????? "編譯時不依賴,運行時才依賴"

public class PersonServiceBean{

? ? ? private PersonDao personDao=new PersonDaoBean();

? ? ? public void save(Person person){

? ? ? ? ? ? personDao.save(person);

? ? ? }

}

PersonDaoBean 是在應用內部創建及維護的,所謂控制反轉就是應用本身不負責依賴對象的創建及維護,依賴對象的創建及維護是由外部容器負責的。這樣控制權就由應用轉移到了外部容器,控制權的轉移就是所謂的反轉。

2.依賴注入

??? 當我們把依賴對象交給外部容器負責創建,那么PersonServiceBean類可以改成

public class PersonServiceBean{

? ? ? private PersonDao personDao;

? ? //通過構造參數,讓容器把創建好的依賴對象注入進PersonServiceBean,當然也可以使用setter方法進行注入

? ? ? public PersonServiceBean(PersonDao personDao ){

? ? ? ? this.personDao=personDao ;

? ? ? }

? ? ? public void save(Person person){

? ? ? ? ? ? personDao.save(person);

? ? ? }

}

所謂依賴注入就是指:在運行期,由外部容器動態地將依賴對象注入到組件中。

Spring AOP

??? 理解“面向切面編程”

??? 那么什么是面向切面編程呢?

比如在兩個類中,可能都需要在每個方法中記錄日志。按照面向對象的設計方法,我們就必須在兩個類的方法中都加入日志的內容。也許他們是完全相同的,但就是因為面向對象的設計讓類與類之間無法聯系,而不能將這些重復的代碼統一起來。

? ?也許有人會說,那好辦啊,我們可以將這段代碼寫在一個獨立的類獨立的方法里,然后再在這兩個類中調用。但是,這樣一來,這兩個類跟我們上面提到的獨立的類就有耦合了,它的改變會影響這兩個類。那么,有沒有什么辦法,能讓我們在需要的時候,隨意地加入代碼呢?這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。

??? 簡單的說就是在不改變原程序的基礎上為代碼增加新的功能,對代碼進行增強處理。

常用增強處理類型

Before 前置增強處理,在目標方法前織入增強處理

AfterReturning 后置增強處理,在目標方法正常執行(不出現異常)后織入處理

AfterThrowing 異常增強處理,在目標方法拋出異常后織入增強處理

After 最終增強處理,無論方法是否拋出異常,都會在目標方法最后織入增強處理

Around 環繞增強處理,在目標方法的前后都可以織入增強處理

Spring AOP配置元素

<aop:config> AOP配置的頂層元素,大多數的<aop:*>元素必須包含在<aop:config>元素內

? <aop:pointcut> 定義切點

? <aop:aspect> 定義切面

??? <aop:after> 定義最終增強(不管被通知的方法是否執行成功)

??? <aop:after-returning>定義after-returning增強

??? <aop:after-throwing>定義after-throwing增強

??? <aop:around> 定義環繞增強

??? <aop:before> 定義前置增強

<aop:aspectj-autoproxy> 啟動@AspectJ注解驅動的切面

使用注解的方式實現IOC


1、@Controller 控制器(注入服務)

2、@Service 服務(業務層)

3、@Repository dao(實現dao訪問)

4、@Component (把普通pojo實例化到spring容器中,相當于配置文件中的<bean id="" class=""/>)

? @Component,@Service,@Controller,@Repository注解的類,并把這些類納入進spring容器中管理。?

在配置文件中添加引入component的掃描組件?

<context:component-scan base-package=”com.mmnc”>

?注意:使用注解方式注入的bean 默認id為類的首字母小寫。

使用注解的方式實現AOP


1、@Aspect 定義切面

2、@Before 前置增強 @AfterReturning 后置增強 @AfterThrowing 異常拋出增強 @After 最終增強 @Around 環繞增強

3、@Pointcut 切點表達式

在配置文件首先要導入aop命名空間 然后添加

?? <aop:aspectj-autoproxy/>元素就可以啟用注解。


原文鏈接:https://blog.csdn.net/qq_38006047/article/details/80797386

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Spring 是一個輕量級的控制反轉(Ioc)和面向切面(AOP)的容器框架。 1、Spring下的...
    熊貓的雄閱讀 1,704評論 0 0
  • Spring的AOP 為什么會出現AOP呢 這就不能不說OOP 面向對象編程 允許開發者定義縱向的關系 并且適用于...
    yubook閱讀 350評論 0 0
  • IOC是一個容器,可以管理和創建對象,一般java程序中的每個業務邏輯至少兩個或以上的對象來協作完成,例如當類A需...
    五月天_7df7閱讀 310評論 0 2
  • PART_ONE:IOCSpring的ioc可以解決開發過程中New對象的操作。 1.除了導入Spring的jar...
    ccccaixiaohao閱讀 126評論 0 0
  • 今天周一是文文老師的流瑜伽課,我喜歡的課程之一, 也是我二月份第一天健身打卡時間。 話說有一個月沒有運動,...
    愛笑丫頭_e800閱讀 286評論 2 4