Spring AOP增強類型(只支持方法層面的增強)
AOP聯盟爲通知Advice定義了org.aopalliance.aop.Interface.Advice
Spring按照通知Advice在目標類方法的連接點位置,可以分爲五類:
1.前置通知 org.springframework.aop.MethodBeforeAdvice 在目標方法執行前實施增強
2.後置通知 org.springframework.aop.AfterReturningAdvice 在目標方法執行後實施增強
3.環繞通知 org.aopalliance.intercept.MethodInterceptro 在目標方法執行前後實施增強
4.異常拋出通知 org.springframework.aop.ThrowsAdvice 在方法拋出異常後實施增強
5.引介通知 org.springframework.aop.IntroductionInterceptor 在目標類中添加一些新的方法和屬性
Spring AOP 切面類型
Advisor:代表一般切面,Advice本身即是一個切面,對目標類所有方法進行攔截。
PointcutAdvisor:代表具有切點的切面,可以指定攔截目標類哪些方法。
IntroductionAdvisor:代表引介切面,針對引介通知而使用切面。
Advisor切面案例
ProxyFactoryBean常用可配置屬性:
target:代理的目標對象
proxyInterfaces:代理要實現的接口
如果多個接口可以使用一下格式賦值:
<list>
<value></value>
...
</list>
proxyTargetClass:是否對類代理而不是接口,設置爲true時,使用CGLib代理。
interceptorNames:需要織入目標的Advice
singleton:返回代理是否爲單例,默認爲單例
optimize:當設置爲true時,強制使用CGLib
配置bean:
<!--配置目標類--> <bean id="studentDao" class="com.imooc.aop.demo3.StudentDaoImpl"></bean> <!--前置通知類型--> <bean id="myBeforeAdvice" class="com.imooc.aop.demo3.MyBeforeAdvice"></bean> <!--Spring的AOP產生代理對象--> <bean id="studentDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--配置目標類--> <property name="target" ref="studentDao"></property> <!--實現的接口--> <property name="proxyInterfaces" value="com.imooc.aop.demo3.StudentDao"></property> <!--採用攔截的名稱--> <property name="interceptorNames" value="myBeforeAdvice"></property> <property name="optimize" value="true"></property> </bean>
PointcutAdvisor切點切面(AsceptJ的基礎)
使用普通Advice作爲切面,將對目標類所有方法進行攔截,不夠靈活,在實際開發中常採用帶有切點的切面。
常用PointcutAdvisor實現類
DefaultPointcutAdvisor最常用的切面類型,它可以通過任意Pointcut和Advice組合定義切面
JdkRegexMethodPointcut構造正則表達式切點
自動創建代理
前面的案例中,每個代理都是通過ProxyFactoryBean織入切面代理,在實際開發中,非常多Bean每個都配置ProxyFactoryBean開發維護量大。
解決方法:自動創建代理。
BeanNameAutoProxyCreator 根據Bean名稱創建代理
DefaultAdvisorAutoProxyCreator 根據切面Advisor本身包含信息創建代理
AnnotationAwareAspectJAutoProxyCreator 基於Bean中AspectJ註解進行自動代理
BeanNameAutoProxyCreator舉例
對所有以DAO結尾Bean所有方法使用代理
DefaultAdvisorAutoProxyCreator 舉例(對某些類的某些方法進行代理)