Spring中AOP原理,源碼學習筆記

一.AOP(面向切面編程):經過預編譯和運行期動態代理的方式在不改變代碼的狀況下給程序動態的添加一些功能。利用AOP能夠對應用程序的各個部分進行隔離,在Spring中AOP主要用來分離業務邏輯和系統級服務。spring

系統級服務指的是:事務處理,日誌記錄,性能統計,安全控制,異常處理等,由於這些功能分散在程序的各個模塊中,又是通用的,因此能夠將它從業務邏輯中分離出來。編程

鏈接點(joinpoint):在鏈接點能夠攔截方法的執行,在鏈接點先後織入上述的這些系統級服務(織入的就是通知)。數組

切入點(pointcut):鏈接點的集合。根據切入點表達式來肯定咱們將執行攔截的位置。安全

通知:到達鏈接點時執行的代碼,即咱們織入的功能。性能

之前的Spring,咱們要使用AOP,在編寫通知時必須實現一些接口,如:實現Before Advice時,Advice類要實現org.springframework.aop.MethodBeforeAdvice接口。spa

如今有另外兩種方式,代理

(1)基於XML Schema的設置,日誌

1package com.savage.aop;  
2.   
3import org.aspectj.lang.JoinPoint;  
4.   
5public class LogBeforeAdvice {  
6.     public void before(JoinPoint joinPoint) {  
7.         System.out.println("Logging before " + joinPoint.getSignature().getName());  
8.     }  
9. }
component

對應XML中的相關配置htm

<bean id="beforeAdvice" class="test.advice.BeforeAdvice" />

<aop-config>

  <aop-aspect id="aspectOne" ref="beforeAdvice">

    <aop-pointcut id="pointcutOne exepression="execution(* test.service.*.*(..))" />

    <aop-before pointcut-ref="pointcutOne" method="before" />  //也可直接簡寫成<aop-before pointcut="execution(* test.service.*.*(..))" method="before" />,去掉<aop-pointcut />

  </aop-aspect>

</aop-config>

如上,編寫通知類不用實現任何接口,JoinPoint對象表明的就是當前鏈接點,供織入功能時使用,經過它可得到目標對象(getTarget()方法),目標方法名(getSignature().getName()),目標方法接收的實參(getArgs(),返回對象數組)等信息。

(2)註解式寫法

在通知類上加註解@Aspect

通知方法上加上通知類型,共有5種通知類型:@Before,@After,@AfterReturning,@AfterThrowing,@Arround

環繞通知最強大,其方法返回類型爲Object,第一個參數必須是ProceedingJoinPoint,方法拋出Throwable

http://book.51cto.com/art/200809/90712.htm

在spring配置文件中添加,

<aop:aspectj-autoproxy />

<context:component-scan base-package="studyspringframe" />

或者不經過註解@component定義bean,則

<aop:aspectj-autoproxy />

<bean class="studyspringframe.aspect.advice.AdviceDefine" /> 

 

 

二.關於開源鏈接池實現DBCP的配置

 

如圖,DBCP鏈接池配置對應的是對象池GenericObjectPool的屬性

相關文章
相關標籤/搜索