通知、切點、通知者
通知
在Spring AOP里有5中類型的通知,分別由一個接口進行定義
Before(前)
|
org.springframework.aop.MethodBeforeAdvice
|
After-returning(返回后)
|
org.springframework.aop.AfterReturningAdvice
|
After-throwing(拋出后)
|
org.springframework.aop.ThrowsAdvice
|
Around(周圍)
|
org.aopalliance.intercept.MethodInterceptor
|
Introduction(引入)
|
org.springframework.aop.IntroductionInterceptor
|
<bean id="audienceAdvice" class="com.springidol.AudienceAdvice"></bean>
//AudienceAdvice類實現了3中不同的3中不同類型的AOP通知。
Public class AudienceAdvice implements MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice{
//前通知要求實現的方法
public void before(Method method,Object[] args,Object target) throws Throwable{
}
//返回后通知要求實現的方法,Object returnValue表示被調用方法的返回值
public void afterReturning(Object returnValue,Method method,Object[] args,Object target) throws Throwable{
}
//拋出后通知不需要實現任何方法,它只是一個標記接口,告訴spring相應的通知要求處理被拋出的異常,除最后一個參數外,其他參數都是可選的
public void afterThrowing(Method method,Object[] args,Object target,NullPointerException e) throws Throwable{
//當發生NullPointerException 時,記錄日志
LOGGER.error("NPE thrown from "+method.getName());
}
}
其中的Method method參數,表示要使用這個通知的方法,第二個參數Object[] args是方法被調用時要傳遞的參數。最后一個是方法調用的目標也就是被調用方法所在的對象。
//周圍通知相當于前通知、后通知、拋出后通知的結合。
Public class AudienceAdvice implements MethodInterceptor{
Public Object invoke(MethodInvocation invocation) throws Throwable{
try{
.............................. //在方法調用之前
Object returnValue=invocation.proceed(); 調用目標方法
............................. //在方法調用之后
}catch(PerformanceException e){
............................. /在出現異常之后
}
}
}
切點
1.正則切點
切點的作用主要在于選擇需要使用通知的方法,比如下面的正則表達式切點:
<bean id="performancePointcut" class="org.springframework.aop.support.JbkRegexpMethodPointcut">
<property name="pattern" value=".*perform" />
</bean>
Pattern屬性用于制定方法匹配所使用的切點模板,本例中被設置為一個正則表達式,它應該匹配任何類里名為perform的方法。
定義切點后,把切點與通知關聯
<bean id="audienceAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" value="audienceAdvice" />
<property name="pointcut" value="performancePointcut" />
</bean>
DefaultPointcutAdvisor是一個通知者類,它只是把通知關聯到一個切點。
也可以使用RegexpMethodPointcutAdvisor是一個特殊的通知者類,可以在一個Bean里面定義切點和通知者
<bean id="audienceAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" value="audienceAdvice" />
<property name="pattern" value=".*perform" />
</bean>
2.定義AspectJ切點
正則表達式雖然可以作為切點定義語言來使用,但是它并不是針對切點而創建的,其主要用途還是文本解析。AspectJ里定義切點的方法就可以看出AspectJ的切點語言是一種真正的切點表達式語言。
<bean id="performancePointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
<property name="expression" value="execution(* Performer+.perform(..))" />
</bean>
可以使用DefaultPointcutAdvisor把它和通知關聯起來,就像前面一樣。同樣,也可以設置一個特殊的通知者
<bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
<property name="advice" value="audienceAdvice" />
<property name="expression" value="execution(* *.perform(..))" />
</bean>
execution(* *.perform(..))
execution表示執行方法時,* *表示任意返回類型,.perform表示perform方法,(..)表示任意參數設置
使用ProxyFactoryBean
<bean id="duke"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>genericdaotest.dao.PersonDao</value>
</property>
<property name="target">
<bean parent="abstractDaoTarget">
<constructor-arg>
<value>genericdaotest.domain.Person</value>
</constructor-arg>
</bean>
</property>
<property name="interceptorNames">
<list>
<value>audienceAdvisor</value>
</list>
</property>
</bean>
Spring里面的ProxyFactoryBean是個工廠Bean,用于生成一個代理,把一個或者多個攔截者(和通知者)應用到Bean,有target、interceptorNames、proxyInterfaces三個屬性,后兩個都是數組屬性target表示要代理的對象。
interceptorNames屬性告訴ProxyFactoryBean哪個通知者要應用于被代理的
beanproxyInterfaces告訴ProxyFactoryBean代理應該實現哪個接口。本例中代理的是genericdaotest.dao.PersonDao接口
target告訴ProxyFactoryBean,哪個Bean是代理。
----------------以上轉載自:http://bhsc.happy.blog.163.com/blog/static/1043895522008111144158773/