javascript
Spring的AOP思想和实现AOP思想的框架AspectJ
章節(jié)目標(biāo):詳細解釋什么是Spring AOP思想和對于該思想實現(xiàn)的AspectJ框架的實現(xiàn)用法。
一.AOP面向切面編程
1.AOP概述
AOP(Aspect Orient Programming)面向切面編程,賣你想切面編程是從倒臺角度烤爐程序運行過程。
AOP底層,采用的是動態(tài)代理模式實現(xiàn)的。具體實現(xiàn)采用了兩種動態(tài)代理:JDK動態(tài)代理和CGLIB動態(tài)代理。
AOP意為面向切面編程,可以通過運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種思想。AOP是Spring框架中的一個重要內(nèi)容。利用AOP可以對業(yè)務(wù)邏輯的各個部分進行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度減低,提高程序的可重用性,同時提高了開發(fā)的效率。
面向切面編程,就是將交叉業(yè)務(wù)邏輯封裝成切面,利用AOP容器的功能將切面織入到主業(yè)務(wù)邏輯中。所謂交叉邏輯是指,通用的和主業(yè)務(wù)邏輯沒有關(guān)系的代碼。如安全檢查、事務(wù)、日志、緩存等。
若不使用AOP,則會出現(xiàn)代碼糾纏,即交叉業(yè)務(wù)邏輯和主業(yè)務(wù)邏輯混合在一起,這樣會使著業(yè)務(wù)邏輯混雜不清。
例如:轉(zhuǎn)賬業(yè)務(wù),在實現(xiàn)轉(zhuǎn)賬業(yè)務(wù)邏輯的前后,需要權(quán)限控制,日志記錄,加載事務(wù),結(jié)束事務(wù)等交叉業(yè)務(wù)邏輯,而這些業(yè)務(wù)邏輯和主業(yè)務(wù)邏輯之間并沒有直接關(guān)系。但是他們的代碼量所占比重可以達到總代碼量的一版甚至還多。它們的存在,不僅僅產(chǎn)生了大量的“冗余”代碼,還大大干擾了主業(yè)務(wù)邏輯。
2.AOP思想有什么好處
3.AOP編程術(shù)語
(1)切面(Aspect)
切面泛指交叉業(yè)務(wù)邏輯,例如:事務(wù)處理、日志處理就可以理解為切面。常用的切面是通知(Advice).實際就是對業(yè)務(wù)邏輯的一種增強。
切面就是一個普通類,將用于增強目標(biāo)類功能的其他功能封裝到一個類中,這個類就叫切面類,切面類需要使用@Aspect注解標(biāo)注,切面類中用于增強目標(biāo)類功能的方法就是普通方法,通過配置文件、將切面中的功能增強到目標(biāo)類的目標(biāo)方法中。
二.AspectJ
1.AspectJ概述
2.AspectJ切入點表達式
3.AspectJ的通知類型
AspectJ中常用的通知類型有五種類型:
前置通知:Before()
后置通知:AfterReturning()
環(huán)繞通知:Around()
異常通知:AfterThrowing()
最終通知:After()
4.初始化Aspectj開發(fā)環(huán)境
加入Spring框架的依賴和AspectJ依賴
在使用AspectJ框架實現(xiàn)AOP思想的時候,要引入AOP的約束,配置文件中使用AOP約束中的標(biāo)簽都是AspectJ框架中的,而不是Spring框架本身的。AsprctJ對于AOP思想的實現(xiàn)有注解和配置文件兩種方式,這里講解的是注解方式。
5.AspectJ基于注解的方式實現(xiàn)AOP思想
(1)定義業(yè)務(wù)接口和實現(xiàn)類
(2)定義切面類
(3)在spring核心配置文件中聲明 切面類和目標(biāo)類對象
(4)注冊AspectJ的自動代理
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--把對象交給spring容器,由spring容器統(tǒng)一創(chuàng)建,管理對象--><!--聲明目標(biāo)對象--><bean id="someService" class="com.bjpowernode.ba01.SomeServiceImpl" /><!--聲明切面類對象--><bean id="myAspect" class="com.bjpowernode.ba01.MyAspect" /><!--聲明自動代理生成器:使用aspectj框架內(nèi)部的功能,創(chuàng)建目標(biāo)對象的代理對象。創(chuàng)建代理對象是在內(nèi)存中實現(xiàn)的, 修改目標(biāo)對象的內(nèi)存中的結(jié)構(gòu)。 創(chuàng)建為代理對象所以目標(biāo)對象就是被修改后的代理對象.aspectj-autoproxy:會把spring容器中的所有的目標(biāo)對象,一次性都生成代理對象。--><aop:aspectj-autoproxy /><!--有接口也想用cjlib實現(xiàn)動態(tài)代理:如果你期望目標(biāo)類有接口,使用cglib代理proxy-target-class="true":告訴框架,要使用cglib動態(tài)代理--> <!-- <aop:aspectj-autoproxy proxy-target-class="true"/>--> </beans>6.AspectJ中實現(xiàn)動態(tài)代理
1.目標(biāo)類有接口默認使用的是JDK動態(tài)代理;
2. 目標(biāo)類沒有接口默認使用的是CJLIB動態(tài)代理;
3. 目標(biāo)類有接口也可以使用CJLIB動態(tài)代理,但是需要設(shè)置spring核心配置文件中的<aop:aspectj-autoproxy >標(biāo)簽;
修改spring的核心配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--把對象交給spring容器,由spring容器統(tǒng)一創(chuàng)建,管理對象--><!--聲明目標(biāo)對象--><bean id="someService" class="com.bjpowernode.ba01.SomeServiceImpl" /><!--聲明切面類對象--><bean id="myAspect" class="com.bjpowernode.ba01.MyAspect" /><!--聲明自動代理生成器:使用aspectj框架內(nèi)部的功能,創(chuàng)建目標(biāo)對象的代理對象。創(chuàng)建代理對象是在內(nèi)存中實現(xiàn)的, 修改目標(biāo)對象的內(nèi)存中的結(jié)構(gòu)。 創(chuàng)建為代理對象所以目標(biāo)對象就是被修改后的代理對象.aspectj-autoproxy:會把spring容器中的所有的目標(biāo)對象,一次性都生成代理對象。--><aop:aspectj-autoproxy /><!--有接口也想用cjlib實現(xiàn)動態(tài)代理:如果你期望目標(biāo)類有接口,使用cglib代理proxy-target-class="true":告訴框架,要使用cglib動態(tài)代理--> <!-- <aop:aspectj-autoproxy proxy-target-class="true"/>--> </beans>三.AspectJ的常用通知類型
1.@Before前置通知-參數(shù)JoinPoint
2.@AfterReturning后置通知-returning屬性
5.@After最終通知(相當(dāng)于finally)
6.@Pointcut定義切入點
總結(jié)
以上是生活随笔為你收集整理的Spring的AOP思想和实现AOP思想的框架AspectJ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx实现静态代理,负载均衡,前后端
- 下一篇: 设置图片垂直居中line-height和