1、没有异常的
2、有异常的
1、被代理类接口Person.java
1 package com.xiaostudy;
2
3 /**
4 * @desc 被代理类接口
5 *
6 * @author xiaostudy
7 *
8 */
9 public interface Person {
10
11 public void add();
12 public void update();
13 public void delete();
14 }
2、被代理类PersonImple.java
1 package com.xiaostudy;
2
3 /**
4 * @desc 被代理类
5 *
6 * @author xiaostudy
7 *
8 */
9 public class PersonImple implements Person {
10
11 /**
12 * @desc 实现接口方法
13 */
14 public void add() {
15 System.out.println("add()>>>>>>>>");
16 }
17
18 @Override
19 public void update() {
20 System.out.println("update()>>>>>>>>");
21 // int i = 1/0;
22 }
23
24 @Override
25 public void delete() {
26 System.out.println("delete()>>>>>>>>");
27 }
28
29 }
3、MyAspectJ.java
1 package com.xiaostudy;
2
3 import org.aspectj.lang.JoinPoint;
4 import org.aspectj.lang.ProceedingJoinPoint;
5
6 /**
7 * @desc 通知类
8 *
9 * @author xiaostudy
10 *
11 */
12 public class MyAspectJ {
13
14 public void myBefort(JoinPoint joinPoint) {
15 System.out.println("前置通知>>>>>>>>>joinPoint: " + joinPoint.getSignature().getName());
16 }
17
18 public void myAfterReturning(JoinPoint joinPoint, Object ret) {
19 System.out.println("后置通知>>>>>>>>>joinPoint: " + joinPoint.getSignature().getName()
20 + ", ret: " + ret);
21 }
22
23 public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable {
24 System.out.println("环绕通知====前>>>>>>>>>>>");
25 Object obj = joinPoint.proceed();
26 System.out.println("环绕通知====后<<<<<<<<<<<");
27 return obj;
28 }
29
30 public void myThrowint(JoinPoint joinPoint, Throwable e) {
31 System.out.println("异常通知>>>>>>>>>joinPoint: " + joinPoint.getSignature().getName()
32 + ", e: " + e.getMessage());
33 System.exit(0);
34 }
35
36 public void myAfter(JoinPoint joinPoint) {
37 System.out.println("最终通知>>>>>>>>>joinPoint: " + joinPoint.getSignature().getName());
38 }
39 }
4、spring的配置文件applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:aop="http://www.springframework.org/schema/aop"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/aop
8 http://www.springframework.org/schema/aop/spring-aop.xsd">
9 <!-- 创建被代理类 -->
10 <bean id="person" class="com.xiaostudy.PersonImple"></bean>
11 <!-- 创建切面类 -->
12 <bean id="advice" class="com.xiaostudy.MyAspectJ"></bean>
13 <!-- springAOP编程 -->
14 <aop:config>
15 <!-- 将切面类 声明“切面”,从而获得通知(方法) -->
16 <aop:aspect ref="advice">
17 <!-- 声明一个切入点,所有的通知都可以使用 -->
18 <aop:pointcut expression="execution(* com.xiaostudy.PersonImple.*(..))" id="myPointcut"/>
19 <!-- 前置通知: method表示:方法名,pointcut-ref表示:所有的通知共享,(pointcut表示:只有当前通知可用,其他的不能用) -->
20 <aop:before method="myBefort" pointcut-ref="myPointcut"/>
21 <!-- 后置通知:returning表示:后置通知的第二个参数名,内容是方法的返回值 -->
22 <aop:after-returning method="myAfterReturning" returning="ret" pointcut-ref="myPointcut"/>
23 <!-- 环绕通知 -->
24 <aop:around method="myAround" pointcut-ref="myPointcut"/>
25 <!-- 异常通知:throwing表示:异常通知的第二个参数,内容是异常信息 -->
26 <aop:after-throwing method="myThrowint" throwing="e" pointcut-ref="myPointcut"/>
27 <!-- 最终通知 -->
28 <aop:after method="myAfter" pointcut-ref="myPointcut"/>
29 </aop:aspect>
30 </aop:config>
31 </beans>
5、测试类Test.java
1 package com.xiaostudy;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 /**
7 * @desc 测试类
8 *
9 * @author xiaostudy
10 *
11 */
12 public class Test {
13
14 public static void main(String[] args) {
15 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
16 Person person = ac.getBean("person", Person.class);
17 person.add();
18 person.update();
19 person.delete();
20 }
21
22 }