學習Spring(第四天)

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 舉例(對某些類的某些方法進行代理)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章