- AspectJ:Java 社區里最完整最流行的 AOP 框架.
- 在 Spring2.0 以上版本中, 可以使用基于 AspectJ 注解或基于 XML 配置的 AOP
### 使用步驟:
1.aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar
2.spring配置文件中添加:xmlns:aop="http://www.springframework.org/schema/aop"
3.要在 Spring IOC 容器中啟用 AspectJ 注解支持, 只要在 Bean 配置文件中定義一個空的 XML 元素 aop:aspectj-autoproxy 。使AspectJ相關注解生效:當調用目標方法,跟Aspect中聲明的方法相匹配的時候,AOP框架會自動的為目標方法所在的類創建代理對象
>#### 1.基于注解的方式實現springAOP:
1.創建切面類(LoggingAspect)。
@Aspect:聲明當前類為切面類。
@Component:交給springIOC容器進行管理。
@Before:前置通知。
需要使用切點表達式:@Before("execution(* cn.li.service.impl.*.*(..))"),/**
* 可以使用AspectJ表達式,對目標方法進行抽象概括。
*
* execution(* cn.li.service.impl.*.*(String,..))
*
* 第一個* 表示匹配所有訪問修飾符 以及所有返回值類型的方法 第二個* 表示當前包下所有的類 第三個* 表示所有的方法名稱 ..
* 表示匹配任意多個參數。 (String,.. )表示匹配第一個參數為String類型的方法,..表示匹配任意數量任意類型的參數。
* String,String 表示匹配參數為兩個字符串的方法。
*/其中(Joinpoint)對象中封裝了目標方法的一些信息,例如獲取目標方法名稱,獲取目標方法參數等。
`@Order(number)`:@Order 表示 配置多個切面之間的優先級問題 。 誰的值越小誰的優先級越高 。
`@After`:后置通知。使用方法與前置通知相同。注意:后置通知即使方法異常也會成功執行,但是后置通知無法拿到目標方法的返回結果。需要返回通知。
`@AfterReturnning`:返回通知,在方法正常之后之后執行的通知,可以拿到目標方法的返回結果。使用返回通知需要注意的是:指定returnning="result",afterReturnningAdvice(JoinPoint joinpoint,Object result)與方法入參位置的對象名稱一致,否則會產生異常。
`@AfterThrowing`:異常通知,方法產生異常的時候,可以拿到異常信息。同樣需要注意的是:指定throwing="e",與afterThrowingAdvice(JoinPoint joinpoint,Exception e)方法入參位置的異常對象名稱一致。
`@Around:`環繞通知
~~~
具體代碼實現如下:》》》》》
//當前類就是一個切面類
//想要一個類成為切面類,1.添加@Component 注釋標注 當前類被springIOC容器所管理
//2.@Aspect表示當前類為一個切面類
//@Order 表示 配置多個切面之間的優先級問題 。 誰的值越小誰的優先級越高 。
//@Order(2)
//@Aspect
//@Component
public class LoggingAspect {
// @Before表示前置通知。指的是在特定位置之前,去執行該方法
// 通知 其實是切面類中一個具體的方法
// JoinPoint 表示連接點
/**
* 可以使用AspectJ表達式,對目標方法進行抽象概括。
*
* execution(* cn.li.service.impl.*.*(String,..))
*
* 第一個* 表示匹配所有訪問修飾符 以及所有返回值類型的方法 第二個* 表示當前包下所有的類 第三個* 表示所有的方法名稱 ..
* 表示匹配任意多個參數。 (String,.. )表示匹配第一個參數為String類型的方法,..表示匹配任意數量任意類型的參數。
* String,String 表示匹配參數為兩個字符串的方法。
*/
//@Pointcut("execution(* cn.li.service.impl.*.*(..))")
public void declareRepeatJoinPointExpression(){
}
//@Before("execution(* cn.li.service.impl.*.*(..))")
public void beforeLog(JoinPoint joinpoint) {
// 通過連接點對象可以獲得調用目標方法的名稱和參數
// 獲得方法名稱。能拿到你要調用方法的名稱
String method = joinpoint.getSignature().getName();
// 獲得調用方法時傳遞的參數
List arguments = Arrays.asList(joinpoint.getArgs());
System.out.println("前置日志調用了方法" + method + "方法,參數是" + arguments);
}
// 注意:后置通知即使方法異常也會成功執行,但是后置通知無法拿到目標方法的返回結果。 需要使用返回通知。。。
//@After("execution(* cn.li.service.impl.*.*(..))")
public void afterLog(JoinPoint joinpoint) {
String method = joinpoint.getSignature().getName();
List arguments = Arrays.asList(joinpoint.getArgs());
System.out.println("后置日志 。");
}
// 返回通知
// 注意:返回通知 ,其實跟后置通知一樣 。都是在目標方法執行完之后 才會被執行 。
// returning="result" 名字 要跟參數列表中 Object 對象的名稱一致 ,不然產生異常。
//@AfterReturning(value = "execution(* cn.li.service.impl.*.*(..))", returning = "result")
public void testAfterReturning(JoinPoint joinpoint, Object result) {
String method = joinpoint.getSignature().getName();
System.out.println("我是返回通知 。 我在目標方法核心業務執行完才會執行 。" + result);
}
//@AfterThrowing(value="execution(* cn.li.service.impl.*.count(..))",throwing="e")
public void testAfterThrowing(JoinPoint joinpoint,Exception e){
System.out.println("我是異常通知 ,我是在方法產生異常后執行的。"+e);
}
//環繞通知 。 跟動態代理的代碼很像。
//@Around("declareRepeatJoinPointExpression()")
// public void around(ProceedingJoinPoint pjp){
// //聲明一個Object 對象 用來表示 目標方法的返回值 。
// Object result=null;
// String method=pjp.getSignature().getName();
// try {
// System.out.println("我是前置日志 。。。"+method);
// result = pjp.proceed();//調用proceed() 表示執行被代理類的目標方法。
// System.out.println("我是返回通知"+method+result);
// } catch (Throwable e) {
// //Throwable 所有異常類跟錯誤類的父類 。Exception Error ...
// // TODO Auto-generated catch block
// e.printStackTrace();
// System.out.println("異常通知,產生異常的時候 會執行catch 里面的代碼 。");
// }
// System.out.println("我是后置通知 。。。"+result+method);
// }
}
~~~
~~~
//@Order(1)
//@Aspect
//@Component
public class CheckAspect {
//@Before("execution(* cn.li.service.impl.*.*(..))")
public void checkBeforeLog(JoinPoint joinpoint){
System.out.println("我是驗證切面的前置通知 。");
}
}
~~~
>#### 2.基于XML文件的方式實現springAOP:
~~~
<!--
@Aspect 注解生效 。
讓注解生效,切面中的注解生效。
當調用目標方法,跟Aspect中聲明的方法相匹配的時候,
AOP框架會自動的為目標方法所在的類創建代理對象。
作用是讓注解生效 ,當調用的方法,跟通知中聲明的方法一致的時候。AOP框架會自動的為那個方法所在的類生成代理對象,然后在調用目標方法(之前或者之后)把通知中的方法加進去。
-->
<!-- <aop:aspectj-autoproxy></aop:aspectj-autoproxy> -->
<!-- 配置切面 的bean -->
<bean id="checkAspect" class="cn.li.aspect.CheckAspect"></bean>
<bean id="loggingAspect" class="cn.li.aspect.LoggingAspect"></bean>
<!-- 配置aop -->
<aop:config>
<!-- 配置切點表達式 -->
<aop:pointcut expression="execution(* cn.li.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:after method="afterLog" pointcut-ref="pointcut"/>
<aop:after-returning method="testAfterReturning" returning="result" pointcut-ref="pointcut"/>
<aop:after-throwing method="testAfterThrowing" throwing="e" pointcut-ref="pointcut"/>
<!-- <aop:around method="around" pointcut-ref="pointcut"/> -->
</aop:aspect>
</aop:config>
~~~
- spring
- 1.spring第一天
- 1.1 安裝spring插件(spring tool suite)
- 1.2 spring概述
- 1.3 控制反轉&依賴注入
- 1.4 springIOC容器
- 1.5 依賴注入的四種方式
- 1.6 配置bean的細節
- 1.7 bean之間的關系
- 1.8 bean作用域
- 1.9 補充:創建對象的幾種方法
- 1源代碼位置
- 2.spring第二天
- 2.1 使用外部屬性文件
- 2.2 spEL
- 2.3 bean的生命周期
- 2.4 通過工廠方式配置bean
- 2.5 基于注解的方式配置bean
- 2.6 組件裝配
- 2.7 靜態代理
- 2.8 動態代理
- 2.9 Cglib代理
- 2源代碼位置
- 3. spring第三天
- 3.1 springAOP
- 3.1.1 AOP簡介
- 3.1.2 為什么使用AOP
- 3.1.3 AOP關鍵術語
- 3.1.4 AOP圖解
- 3.1.5 springAOP實現步驟
- 3.1.6 SpringAOP實現原理:
- 3.1.7 AOP的好處
- 3.1.8 AOP在實際項目中的主要應用
- 3代碼地址
- 3.1.9 純注解版配置aop的方式
- 3.2 maven環境搭建
- 附IDEA激活碼
- 4. spring第四天
- 4.1 c3p0事務
- 4.2 命令窗口事務
- 4.3 c3p0連接池設置
- 4.4 事務中的一些基本概念
- 4.5 事務的傳播行為
- 4.6 自定義異常
- 4.7 spring整合Junit單元測試
- 4.8 JdbcTemplate(附源代碼)
- 事務源代碼
- 4.9 純注解tx
- 4.10 基于xml配置事務
- 0. jsp頁面修改編碼方式
- 0.1 eclipse配置tomcat
- 0.單例模式-飽漢模式
- 0.單例模式-饑漢模式
- springMVC
- 1. springmvc第一天
- 1.1 springMVC概述
- 1.2 springmvc框架搭建及第一個應用程序
- 1.3 @RequestMapping
- 1.4 RequestMapping修飾類
- 1.5 RequestMapping精準化映射
- 1.6 Ant風格URL
- 1.7 帶有占位符的url映射
- 1.8 REST風格
- 1.9 RequerstParam獲取請求正文
- 2. springmvc第二天
- 2.1 優化
- 2.2 POJO綁定請求參數
- 2.3 RequestHeader獲取請求報頭信息
- 2.4 CookieValue獲取Cookie信息
- 2.5 獲取原生ServletAPI
- 2.6 ModelAndView處理模型數據
- 2.7 Map、Model、ModelMap處理模型數據
- 2.8 @SessionAttributes注解
- 2.9 @ModelAttribute無返回值方法及方法入參
- 2.10 @ModelAttribute修飾有返回值類型的方法
- 代碼地址
- 3. springmvc補充
- 3-1 springmvc工作原理
- 3-2 springmvc form表單提交中文亂碼
- 3-3 數據的格式化
- 3-4 自定義類型轉換器
- 3-5 其他知識點
- 3-6 crud代碼
- 3-7 @DateTimeFormat日期格式化
- 3-8 數據驗證的概念及JSR303驗證
- 3-9 Hibernate-Validator驗證框架
- 3-10 Controller捕獲錯誤消息
- 3-11 errors標簽在頁面中獲取錯誤消息
- 3-12 錯誤消息的定制及國際化
- 3-13 自定義攔截器
- 3-14 Java代碼中獲取國際化信息
- 3-15 超級鏈接設置國際化
- 3-16 AJAX支持之@RequestBody
- mybatis
- 1. mybatis第一天
- 1. 為什么使用mybatis
- 2. 下載地址
- 3. hello
- 4. mybatis三種開發模式
- 5. 全局配屬屬性內容
- 6. DTD設置
- 7. Mapper中的CRUD
- 8. 8.mybatis使用主鍵自增
- 9. #{}中的參數處理
- 10. #{}與${}區別
- 11. 集合數據的查詢
- 12 動態sql
- 12.1 if
- 12.2 choose, when, otherwise
- 12.3 trim, where, set
- 12.4 foreach
- 代碼位置
- 2. mybatis第二天
- 1.封裝map類型的數據
- 2. resultMap自定義封裝規則
- 0代碼位置
- 3. mybatis緩存機制
- ssm整合
- 1.maven
- 2.ssm基礎環境搭建
- 2-1 引入項目依賴的jar包
- 2-2 引入bootstrap,jquery
- 2-3 創建項目包結構
- 2-4 編寫web.xml配置文件
- 2-5 編寫sping,springmvc,mybatis配置文件
- 2-6 逆向工程mbg.xml
- shiro安全框架
- 1.shiro簡介
- 易購Buy商城
- 第一天
- 1.課程計劃
- 2.電商行業背景
- 3.易購Buy介紹
- 4.易購Buy架構
- 5.工程搭建
- 6.工程啟動和測試
- 7.ssm框架整合
- 8.整合測試
- 9.svn
- 9.1 svn服務端
- 9.2 svn客戶端
- 第二天
- 1.SOA架構分析
- 2.dubbo使用方法
- 3.注冊中心
- 4.工程改造
- 5.easyUI
- maven
- 1.maven介紹
- 2.idea配置maven和服務器
- 3.創建web工程
- 4.分模塊構建工程
- 5. 代碼位置
- 6. nexus
- Luence搜索
- 1.了解搜索技術
- 2.Lucene的基本使用
- solr
- SolrCloud