Spring2

Spring AOP:
AOP:Aspect Oriented Programming 面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的同意維護的一種技術.
主要功能:日誌記錄,性能統計,安全控制,事務處理,異常處理
主要意圖:將以上代碼從業務邏輯中抽取出來
AOP和OOP的區別:
OOP:面向對象編程,針對業務處理過程的實體及其屬性和行爲進行抽象封裝,以獲得更加清晰高效的邏輯單元劃分
AOP:針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果
OOD/OOP面向名詞領域,AOP面向動詞領域
相關術語:
目標對象 target:【***】
被增強的對象
連接點 join point
目標對象的方法
切入點 pointcut 【***】
被攔截的連接點
通知 advice 【***】
增強業務
引介 introduction
特殊通知,在不修改代碼的前提下,在運行期動態添加方法或屬性
切面 aspect 【***】
切入點+通知
織入 
創建出代理對象的過程
代理 proxy 【***】
代理類
Spring的AOP爲動態AOP,實現技術爲:JDK提供的動態代理和CGLIB(動態字節碼增強技術) 【****】


JDK的動態代理:
Object object = Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h);

CGLIB的動態代理:
使用前提:
導入cglib的jar包和asm相關的jar包,而Spring框架的spring-core.jar集成了cglib和asm.
使用:
//1.創建Enhancer
Enhancer enhancer = new Enhancer();
//2.傳遞目標對象的CLass
enhancer.setSuperclass(target.getClass);
//3.設置回調操作
enhancer.setCallback(callback);
-->傳遞的是Callback的子接口MethodInterceptor
return enhancer.create();

Spring採用的是哪一種動態機制:【*****】
如果目標對象有接口,優先使用jdk的動態代理,基於接口
如果目標對象無接口,優先使用cglib動態代理,基於繼承

Spring的Aop編程:
1、傳統AOP編程:
支持的增強(advice):
1.前置通知  目標方法執行前增強  org.springframework.aop.MethodBeforeAdvice
2.後置通知  目標方法執行後增強 org.springframework.aop.AfterReturningAdvice
3.環繞通知  目標方法執行前後進行增強  org.aopalliance.intercept.MethodInterceptor
4.異常拋出通知 目標方法拋出異常後的增強 org.springframework.aop.ThrowsAdvice
5.引介通知 在目標類中添加一些新的方法或屬性(瞭解)org.springframework.aop.IntroductionInterceptor
基本jar包:
bena/core/context/expression/aop/aop聯盟依賴jar包
配置:
<!-- 目標targrt -->
<bean id="目標" class="">
<!-- 通知advice -->
<bean id="通知" class="">
<!-- 切點pointcut -->
<bean id="切點" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>增強的方法名</value>
...
<list>
</property>
</bean>

<bean id="切點" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value="正則表達式指定增強的方法"></property>
</bean>
<!-- 切面 -->
<bean id="切面" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="通知"></property>
<property name="pointcut" ref="切點"></property>
</bean>
<!-- 代理proxy -->
<bean id="代理" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="目標"></property>
<property name="interceptorNames" value="切面"></property>
<property name="proxyInterfaces" value="實現的接口的全路徑"></property>
</bean>

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean> <!-- 自動代理 -->
2、基於aspectj切點傳統開發:
前提條件:
在覈心配置文件中導入aop的聲明
使用aspectj的切面聲明方式,需要導入aspectj的jar包-->com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
配置:
<!-- 目標targrt -->
<bean id="目標" class="">
<!-- 通知advice -->
<bean id="通知" class="">
<!-- 切面與切點的聲明 -->
<aop:config> <!-- 自動代理 -->
<!-- 切點 -->
<aop:pointcut expression="切點表達式" id="切點名"/>
<!-- 切面 -->
<aop:advisor advice-ref="通知" pointcut-ref="切點名"/>
</aop:config>
切點表達式:
常用:
execution(pubic * *(..))所有public方法
execution(* com.yyy.xxx..*.*(..))所有xxx包及其子包下的索引類的方法
execution(* com.yyy.xxx.zzz.*(..))zzz接口的所有方法
execution(* com.yyy.xxx.zzz+.*(..))zzz接口的實現類的所有方法
execution(* save*(..))save開頭的方法
3、Spring整合sqpectj框架實現aop
aspectj定義的通知類型:
前置通知 before
後置通知 afterReturning
環繞通知 around
拋出異常通知 afterThrowing
引介通知 declareParents
最終通知 after
配置:
<!-- 目標targrt -->
<bean id="目標" class="">
<!-- 通知advice -->
<bean id="通知" class="">
<!-- 切面與切點的聲明 -->
<aop:config proxy-target-class="true/false"> <!-- 自動代理 -->
<aop:aspect ref="通知"> <!-- 配置切面 -->
<aop:pointcut expression="切點表達式" id="pointCut"/>
<aop:before method="before" pointcut-ref="pointCut"/>
<aop:after-returning method="afterReturning" pointcut-ref="pointCut" returning="返回值名"/>
<aop:around method="around" pointcut-ref="pointCut"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="pointCut" throwing="異常名"/>
<aop:after method="after" pointcut-ref="pointCut"/>
</aop:aspect>
</aop:config>
關於通知上的參數:
1、前置通知的參數:
JoinPoint jp-->獲取目標相關的信息
-->攔截目標類:jp.getSignature().getDeclaringTypeName()
-->拉結方法:jp.getSignature.getName();
-->完成日誌記錄,權限控制
2、後置通知的參數:
JoinPoint jp-->
Object val-->目標方法的返回值,需要在配置文件上配置returning="val"
3、環繞通知的參數:
ProceedingJoinPoint pjp-->執行目標行爲
-->Object value = pjp.proceed();
-->日誌操作,權限操作,性能監控,事務管理
4、拋出異常通知的參數:
JoinPoint jp-->
Throwable ex-->接收拋出的異常,需要在配置文件上配置throwing="ex"
5、最終通知上的參數:
JoinPoint-->
-->可以完成資源釋放
關於代理的選擇:
配置:
<aop:config proxy-target-class="true/false">
-->false爲默認值,
-->配置true表示始終使用cglib代理
4、基於annotation的aop實現
前提條件:
需要配置註解的配置:
<context:component-scan base-packafe="掃描的包"/>
需要配置開啓sapectj註解自動代理:
<aop:aspect-autoproxy/>
編寫增強:
在類上:
@Comonent
@Aspect //聲明當前類就是一個切面
前置通知:
@Before(切點表達式)
後置通知
@AfterReturning(value="切點表達式",retruning="返回值名")
環繞通知:
@Around("切點表達式")
異常拋出通知:
@AfterThrowing(value="切點表達式",throwing="拋出異常名")
z最終通知:
@After("切點表達式")
-->註解定義切點:
@Point("切點表達式")
private void xxx(){}
-->通知中可不寫切點表達式,寫定義切點的方法名xxx(),可定義多個切點,切點之間允許邏輯運算符結合,xxx()||yyy()
代理方式的選擇:
可在開啓aspectj註解自動代理中配置
-->proxy-rtarget-class="true/false"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章