Spring 中各種通知


 1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:aop="http://www.springframework.org/schema/aop"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
7 http://www.springframework.org/schema/aop
8 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
9 <!--
10 1、引入AOP的命名空間
11 xmlns:aop="http://www.springframework.org/schema/aop"
12 http://www.springframework.org/schema/aop
13 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
14 2、目標類
15 3、切面
16 4、攔截器 由spring內部實現
17 5、aop的配置
18 -->
19 <bean id="personDao" class="cn.test.aop.PersonDaoImpl"></bean>
20 <bean id="transaction" class="cn.test.aop.Transaction"></bean>
21
22 <!-- aop配置 -->
23 <aop:config>
24 <!-- 切入點表達式
25 expression
26 確定哪個類可以生成代理對象
27 id 唯一標識 -->
28 <aop:pointcut expression="execution(* cn.test.aop.PersonDaoImpl.*(..))" id="perform"/>
29 <!-- 切面 -->
30 <aop:aspect ref="transaction">
31 <!-- 前置通知
32 * 在目標方法執行之前
33 -->
34 <aop:before method="beginTransaction" pointcut-ref="perform"/>
35 <!-- 后置通知
36 * 在目標方法執行之后
37 * 可以根據returning獲取目標方法的返回值
38 * 如果目標方法遇到異常,該通知不執行
39 -->
40 <aop:after-returning method="commit" pointcut-ref="perform" returning="val"/>
41 <!-- 前置通知和后置通知只能在目標方法文中添加內容,但是控制不了目標方法的執行 -->
42 <!--
43 最終通知
44 * 在目標方法執行之后
45 * 無論目標方法是否遇到異常,都執行
46 * 經常做一些關閉資源
47 -->
48 <aop:after method="finallyMethod" pointcut-ref="perform"/>
49 <!--
50 異常通知
51 目的就是為了獲取目標方法拋出的異常
52 -->
53 <aop:after-throwing method="exceptionMethod" throwing="ex" pointcut-ref="perform"/>
54
55 </aop:aspect>
56 </aop:config>
57
58
59 </beans>
 Transaction.java
1
public class Transaction { 2 //joinPoint 連接點信息
3 public void beginTransaction(JoinPoint joinPoint){
4 joinPoint.getArgs();//獲取方法的參數
5 String methodName = joinPoint.getSignature().getName();
6 System.out.println(methodName);
7 System.err.println("begin trans action");
8 }
9 public void commit(JoinPoint joinPoint,Object val){
10 System.err.println("commit");
11 }
12
13 public void finallyMethod(){
14 System.err.println("finally method");
15 }
16
17 public void exceptionMethod(Throwable ex){
18 System.err.println(ex.getMessage());
19 }
20
21 /**
22 * 環繞通知
23 * 能控制目標方法的執行
24 */
25
26 public void aroundMethod(ProceedingJoinPoint joinPoint){
27 String methodName=joinPoint.getSignature().getName();
28 if("addPerson".equals(methodName)){
29
30 }
31 }

測試:

 1 /**
2 * 原理
3 * * 加載配置文件,啟動spring容器
4 * * spring容器為bean創建對象
5 * * 解析aop的配置,會解析切入點表達式
6 * * 看納入spring管理的那個類和切入點表達式匹配,如果匹配則會為該類創建代理對象
7 * * 代理對象的方法體的形成就是目標方法+通知
8 * * 客戶端在context.getBean時,如果該bean有代理對象,則返回代理對象,如果沒有代理對象則返回原來的對象
9 * 說明:
10 * 如果目標類實現了接口,則spring容器會采用jdkproxy,如果目標類沒有實現接口,則spring容器會采用
11 * cglibproxy
12 *
13 * */
14 @Test
15 public void doSome(){
16
17 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("cn/test/aop/applicationContext.xml");
18 PersonDao personDao= (PersonDao) applicationContext.getBean("personDao");
19
20 personDao.addPerson();
21
22 }

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com