當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring4基础 学习笔记(3) ---- AOP(1) ---- 基于Xml
生活随笔
收集整理的這篇文章主要介紹了
Spring4基础 学习笔记(3) ---- AOP(1) ---- 基于Xml
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AOP: 術語: 連接點:可以被切面織入的方法(這里的 可以 ?指的是在容器中注冊為連接點) 切入點:具體要被織入的方法 目標對象:要被織入的方法所在的對象 通知(Advice):切面的一種實現,可以完成簡單的織入功能。定義了織入時間。即增強的業務什么時候實現,主業務之前或者之后 ? 顧問(Advisor):將通知進一步包裝。可以選擇增強的方法 用代理實現AOP:將交叉業務和系統級服務放在代理中。 AOP環境搭建: 1)導入jar: 2)原來的applicationContext.xml規范 通知(Advice):AOP 1)MethodBeforeAdvice ?: 前置通知 定義實現該接口的類(切面) 注冊該類 <!-- 切面 --> <bean id="before" class="MyMethodBeforeAdvice"/> 注冊代理工廠bean,用來提供代理對象, <bean id="Factory" class="org.springframework.aop.framework.ProxyFactoryBean"> 設置工廠的參數: <property name="targetName" value="someService"/> 或者 <property name="target" ref = "service.ISomeServiceImpl"/> 配置切面: <!-- 切面 --> <property name="interceptorNames" value="before" ? ? ? ? ? ? ? ? ? ? ? 2)AfterRunningAdvice:后置通知,多了業務方法返回值,其余同上 3)MethodInterceptor:環繞通知 public class myMethodInterceptor implements MethodInterceptor { ??????@Override ??????public Object invoke(MethodInvocation invocation) throws Throwable { ????????????// TODO Auto-generated method stub ????????????System.out.println("之前"); //注意:這個方法返回值是業務里doFirst方法返回值 ????????????Object result = invocation.proceed();????? ????????????System.out.println("之后"); ????????????return result; ??????} } 輸出 : 之前 執行doFirst方法 之后 參數invocation.proceed方法執行業務方法 4)ThrowsAdvice:異常通知 //異常通知 public??class??myThrowsAdvice implements ThrowsAdvice { ??????public void afterThrowing(Exception ex) { ????????????System.out.println("執行異常通知方法" +ex.getMessage() ); ??????} } 給對象織入多個切面: ????????????<property name="interceptorNames"> ??????????????????<array> ????????????????????????<value>before</value> ??????????????????</array> ????????????</property> ???????????? ????????????<!-- <property name="interceptorNames" value="用逗號分割"> --> 使用<bean id="Factory" class="org.springframework.aop.framework.ProxyFactoryBean"> 這種方式:有接口會生成JDKDynamicProxy對象,沒有接口會使用CGLIB動態代理 在有接口情況下使用CGLIB代理: 增加一個property-><property name="proxyTargetClass" value="true"> ? 或者:<property name="optimize" value="true"> ? ? ?? 顧問:選擇切入點(Advice所有方法都切入,只是簡單實現) PointcutAdvisor接口常用實現類: NameMatchMethodPonitcutAdvisor:名稱匹配方法切入點顧問 ??????<!-- 切面 --> ??????<bean id="before" class="MyMethodBeforeAdvice"/> ?????? ??????<!-- 注冊Advisor --> ??????<bean id="myAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> ????????????<property name="advice" ref="before"/> ????????????<property name="mappedName" value="doFirst"/> ??????</bean> 使用mappedNames匹配多個方法 <property name="mappedName" value="*ir*"/> ?--->?使用通配符匹配帶有ir的 使用顧問(而不是切面) <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> ????????????<!-- <property name="targetName" value="someService"/> --> ????????????<property name="target" ref ="someService"/> ????????????<!-- 包裝切面 --> ????????????<property name="interceptorNames" value="myAdvisor" />? ? </bean> RegexMethodPointcutAdvisor : 正則表達式匹配方法切入點顧問 正則表達式:
??????<bean id="myAdvisor2" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> ????????????<property name="advice" ref="before"/> ????????????<property name="pattern" value=".*i.*"/> ? ? ? ? ?//任意字符出現一次或者多次,使用patterns匹配多個模式 ? ?? </bean> 注意:pattern匹配的是全限定性方法名,doFirst無法匹配dofirst方法,.*doFirst可以匹配 問題 : 如果被代理對象有多個,那么代理bean需要多個。 自動代理生成器(均繼承自bean后處理器BeanPostProcessor,容器中所有Bean在初始化時均會自動執行Bean后處理器中的方法,故其無需id屬性): 默認advisor自動代理生成器 bean名稱自動代理生成器 1)默認advisor自動代理生成器: ??????<!-- 注冊自動代理生成器 --> ??????<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" /> 缺點:默認使用顧問(容器里配置的顧問),所有bean的顧問指定方法都會織入 2)bean名稱自動代理生成器:可以實現對指定bean的切入和指定方法的切入 ??????<!-- bean名稱自動代理生成器 --> ??????<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" > ????????????<property name="beanNames" value="someService"/> ????????????<!-- 還能指定切面 --> ????????????<property name="interceptorNames" value="myAdvisor"/> ??????</bean>
| 運算符 | 名稱 | 意義 |
| . | 點號 | 表示任意單個字符 |
| + | 加號 | 表示前一個字符出現一次或者多次 |
| * | 星號 | 表示前一個字符出現0次或者多次 |
| | | A | B ? 模式A或者模式B | 或者 |
轉載于:https://www.cnblogs.com/coderlynn/p/8654321.html
總結
以上是生活随笔為你收集整理的Spring4基础 学习笔记(3) ---- AOP(1) ---- 基于Xml的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018.3.26 1501 二叉树最
- 下一篇: C# 创建Word项目标号列表、多级编号