您好,登錄后才能下訂單哦!
前面的文章中對SpringAOP進行了簡單的實踐,本章將說明在實際的開發中如何對切面進行配置使用.
1,直接使用Advice來作用到目標類的所有方法上
<!--配置Advice-->
<bean id="customAdvice" class=""/>
<!--目標對象-->
<bean id="target" class=""/>
<!--配置代理工廠-->
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"
p:proxyInterfaces="com.xx.MyInterface" <!--指定代理的接口-->
p:interceptorNames="customAdvice" <!--指定增強-->
p:target-ref="target"/> <!--指定要代理的bean-->
proxyInterfaces(interfaces):代理索要實現的接口,多個可用逗號分隔;
interceptorNames:目標對象列表,多個可用逗號分隔;
singleton:返回的代理是否為單例,默認是;
optimize屬性設置為true,強制使用CGLib動態代理。
還可以使用屬性proxyTargetClass指明是否是對類進行代理而不是接口, 當設置為true時,使用CGlib動態代理并且無需再設置proxyInterfaces屬性,即便設置也會被忽略;
除了上面說到的使用逗號來分隔多個增強外,還可以像下面這樣使用
<property name="interceptorNames">
<list>
<idref local="advice1" />
<idref local="advice2" />
</list>
</property>
2,通過自定義切面來應用增強
<bean id="customAdvice" class=""/>
<bean id="customAdvisor" class="com.custom.xx"
p:advice-ref="customAdvice"/> <!--定義切面-->
<bean id="base" abstract="true" <!--定義公共配置類-->
class="org.springframework.aop.framework.ProxyFactoryBean"
p:interceptorNames="customAdvisor" />
<bean id="proxy1" parent="base" p:target-ref="" />
<bean id="proxy2" parent="base" p:target-ref="" />
3,通過正則切面來應用增強
<bean id="regexAdvisor"
class="org.springframework.aop.support.RegexpMethonPointcutAdvisor"
p:advice-ref="customAdvice"
<property name="patterns">
<list>
<value>.*insert*</value>
</list>
</property>
</bean>
<bean id="proxy"
class="org.springframework.aop.framework.ProxyFactoryBean"
p:interceptorNames="regexAdvisor"
p:target-ref=""
p:proxyTargetClass="true"/>
上面的配置都需要顯示的配置代理對象,對于小型的應用或不嫌麻煩的話還是可以接受的,大如果面對中大型的系統來講,通過上面的配置來達到目的既容易出錯,更是十分的麻煩,所以Spring提供了自動代理機制,從而讓開發人員從煩亂的配置中解脫出來。
自動代理機制是基于BeanPostProcessor實現,自動代創建器根據 一些規則來自動在容器中實例化Bean時為匹配的Bean生成代理實例。其代理創建器主要分為3類
1,基于Bean配置名規則的自動代理創建器:允許為一組特定配置名的Bean自動創建代理實例,實現類為BeanNameAutoProxyCreator
2,基于Advisor匹配機制的自動代理創建器:它對容器中所有的Advisor進行掃描,自動將這些切面應用到匹配的Bean中(為目標Bean創建代理實例),實現類為DefaultAdvisorAutoProxyCreator.
3,基于Bean中AspectJ注解的自動代理創建器:為包含AspectJ注解的Bean自動創建代理實例,實現類為AnnotationAwareAspectJAutoProxyCreator.
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProyCreator"
p:beanNames="*er"
p:interceptorNames=""
p:optimize="true" />
<bean id="regexAdrisor" class="" />
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
1)XML配置來啟用AnnotationAwareAspectJAutoProxyCreator
<!--使用@AspectJ注解定義的切面類-->
<bean id="aspectJAnnotationBean" class="" />
<!--自動代理創建器,自動將@AspectJ注解切面類織入目標bean中-->
<bean class="org.springframework.aop.framework.autoproxy.AnnotationAwareAspectJAutoProxyCreator" />
2)使用Schema的aop命名空間進行配置
<!--基于@AspectJ切面的驅動器-->
<aop:aspectj-autoproxy/>
<!--使用@AspectJ注解定義的切面類-->
<bean class="com.xx.customAspectJAdvisor" />
3)還可以使用注解的方式來裝配
<!-- 使用注解來裝配(等同schema方式)-->
@EnableAspectJAutoProxy(exposeProxy=true)
<!--使用@AspectJ注解定義的切面類-->
<bean id="aspectJAnnotationBean" class="" />
切面類舉例:
@Aspect
@Component
public class CustomAspect {
/*
執行getName方法后執行
*/
@AfterReturning(returning = "result", pointcut = "execution(* com.xx.getName())")
public void singeLoginAfter(String result) throws Exception {
//TODO
}
/*
使用注解CustomAnnoation的方法執行后
*/
@AfterReturning("@annotation(com.xx.annotation.CustomAnnoation)")
public void refreshLinkGroupCache(JoinPoint joinPoint) {
}
}
1,如果增強在同一個切面類中申明,則依照增強在連接點上的織入順序進行織入
2,如果增強位于不同的切面類中,且這些切面類都實現了org.springframework.core.Ordered接口,則有切口方法的順序號決定(順序號小的先織入)
3,如果增強位于不同的切面類中,且這些切面類沒有實現了org.springframework.core.Ordered接口,則織入的順序不確定
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。