# aop的使用
當調用目標方法,跟Aspect中聲明的方法相匹配的時候,
AOP框架會自動的為目標方法所在的類創建代理對象。
> ## 注解方式
1. 切面注解配置(在spring beans 配置文件中)
```
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
```
2. 在相應的切面類中添加注解
@Aspect
@Order 表示配置多個切面之間的優先級問題 。誰的值越小誰的優先級越高 。
@Component
3. 表示通知并設置切點
- **標識通知**
@Before 前置通知 (JoinPoint)
@After 后置通知 (JoinPoint)
@AfterReturning 返回通知 (JoinPoint,Object)
@AfterThrowing 異常通知 (JoinPoint,Exception)
@Around 環繞通知 (上面標識通知的整合) (ProceedingJoinPoint)
**tip**:需要調用方法ProceedingJoinPoint的proceed()方法,寫在語句前為前置通知,
語句后為后置通知,方法返回值為返回通知,該法方法異常處理為異常通知;
例子
```
@AfterReturning(value="execution(* com.igeek.service.impl.*.*(..))",returning="sb")
public void testAfterReturning(JoinPoint joinpoint,Object sb){
//returning值必須與對象名一致
String method = joinpoint.getSignature().getName();
System.out.println("我是返回通知 。 我在目標方法核心業務執行完才會執行 。"+sb);
}
第一個* 表示匹配所有訪問修飾符 以及所有返回值類型的方法
第二個* 表示當前包下所有的類
第三個* 表示所有的方法名稱
.. 表示匹配任意多個參數。
* (String,.. )表示匹配第一個參數為String類型的方法,..表示匹配任意數量任意類型的參數。
(String,String) 表示匹配參數為兩個字符串的方法。
```
切點可以通過注解@Pointcut方法配置,避免代碼耦合
例子
@Pointcut("execution(* com.igeek.service.impl.*.*(..))")
public void declareRepeatJoinPointExpression(){
}
- **execution表達式**
execution(public * *(..)) 匹配所有類public方法
execution(* com.baidu.dao.*(..)) 匹配指定包下所有類方法,不包含子包
execution(* com.baidu.dao..* (..)) ..* 表示包、子孫包下所有類
execution(* com.baidu.service.UserService.*(..)) 匹配指定類所有方法
execution(* com.baidu.dao.GenericDAO+.*(..)) 匹配實現特定接口所有類方法
execution(* save*(..)) 匹配所有save開頭的方法
- **回調屬性JoinPoint 屬性**
`getSignature().getName()`獲得調用函數方法名
` getArgs()`獲得參數列表,返回數組
> ## XML方式
1. 引入aop:config標簽
2. 配置切點,引入aop:pointcut子標簽
`<aop:pointcut expression="execution(* com.igeek.service.impl.*.*(..))" id="pointcut"/>`
3. 配置切面,引入aop:aspect子標簽
`<aop:aspect ref="checkAspect" order="1"></aop:aspect> `//ref:指向切面的容器bean的id值
4. 在切面引入標識通知,引入切面子標簽aop:before|after...
`<aop:before method="checkBeforeLog" pointcut-ref="pointcut"/> //method:觸發的通知方法名稱 pointcut-ref:映射配置切點的id`
例子
<bean id="checkAspect" class="com.igeek.aspect.CheckAspect"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.igeek.service.impl.*.*(..))" id="pointcut"/>
<aop:aspect ref="checkAspect" order="1">
<aop:before method="checkBeforeLog" pointcut-ref="pointcut"/>
</aop:aspect>
<aop:aspect ref="loggingAspect" order="2">
<aop:before method="beforeLog" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
- 第一章 java SE
- 1.1數據類型
- 1.2 流程控制語句
- 1.3 方法
- 1.4 面向對象三特性
- 1.5 對象數組與集合
- 1.6 數組和集合操作工具類
- 1.7 可變參數
- 1.8 String
- 1.9 StringBuilder
- 1.10 final&&finally&&finalize
- 1.11 抽象類與接口
- 1.12 基本數據類型的包裝類
- 1.13 泛型
- 1.14 內部類
- 1.15 throw & throws & try catch
- 1.16 線程
- 1.17 BeanUtils
- 1.18 java反射
- 1.19 序列化和反序列化
- 1.20 IO輸入輸出流
- 1.21 File
- 1.22 RandomAccessFile
- 1.23 第三方工具CommonsIO
- 1.24 java網絡傳輸
- 第二章 java EE
- 2.1 maven的配置
- 2.2 Cookie
- 2.3 EL表達式 JSTL
- 2.4 驗證相關
- 2.4.1 驗證碼
- 2.5 防重復提交
- 2.6 activeMq的使用
- 2.7 jtl的使用
- 2.8 Upload上傳文件
- 第三章 Spring相關
- 3.1 IOC/DI
- bean的生命周期
- bean的配置
- 3.2 Spring Aop
- 3.3 Spring Jdbc
- 3.4 事物相關
- 事物
- 事物的使用
- 3.5 MBG使用
- 第四章 解決問題方法
- 4.1 List轉換為Map
- 4.2 結果返回類
- 4.3 HSSF的使用
- 第五章 排序
- 5.1 冒泡排序
- 5.2 選擇排序
- 5.3 快速排序