<!--AOP 面向切面编程-->
在xml中启用AspectJ
<context:component-scan base-package="com.wsl.aop"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
1 //编写一个抽象接口calcinterface
2 public interface calcinterface
3 {
4 public int add(int x , int y);
5 public int sub(int x , int y);
6 public int mul(int x , int y);
7 public int div(int x , int y);
8 }
9
10 编写一个calcimpl类实现calcinterface接口
11 @Component(value ="calc")
12 public class calcimpl implements calcinterface
13 {
14 ..............//实现接口方法
15 }
16
17 编写日志类
18 @Order(2) //指定切面的优先级 , 值越小优先级越高,如果同时两个切面对应一个类, 那么在
19 //这两个切面中@Order(X) x的值越小 , 优先级 越高 , 先执行这个切面
20 @Aspect //AspectJ注解
21 @Component //IOC bean注解
22 public class calcproxy
23 {
24 @Before("execution(public int com.wsl.aop.calcinterface.*(..))")//注意,此处扑捉的是接口 , 当中的公共 返回int的全部方法,也可以写参数,或函数名明确捕捉。
25 public void before(JoinPoint joinpoint)
26 {
27 String methodname = joinpoint.getSignature().getName();//得到事件名
28 System.err.println("before message "+methodname +" method 。。。。。"+ ArraysAsList(joinpoint.getArgs())); //输出信息+全部参数
29 }
30
31 @After消息 :使用和上面一样 , //不管是否出错,都调用
32 @AfterReturning://正确返回时调用
33 @AfterReturning(value = "execution(public int com.wsl.aop.calcinterface.*(..))",returning = "result")
34 public void afterrerutn(JoinPoint joinpoint , Object result)
35 @AfterThrowing//异常通知,在执行方法时抛异常调用
36 @AfterThrowing(value = "execution(public int com.wsl.aop.calcinterface.*(..))",throwing = "e")
37 public void throwmethod(JoinPoint joinpoint ,Exception e)
38 @Around:不能和之前的四个消息共存
39 @Around("execution(public int com.wsl.aop.calcinterface.*(..))")
40 public Object around_method(ProceedingJoinPoint point )
41 {
42 Object resultObject = null;
43
44 try {
45 System.out.println("around message" + Arrays.asList(point.getArgs()));
46 System.out.println("before message");
47 resultObject = point.proceed();
48 System.out.println("after message");
49
50 } catch (Throwable e) {
51 // TODO Auto-generated catch block
52 System.out.println("throw message "+ e);
53 }
54 System.out.println("return message");
55 return resultObject;
56 }
57 }
58
59 重用切点表达式
60 定义一个方法 , 用于申明切入点表达式。 一般地 , 该方法再不需要加入其他代码 , 如:
61
62 @Pointcut("execution(public int com.wsl.aop.calcinterface.*(..))")
63 public void getJoinPoint(){}
64
65 在使用时
66 @Around("getJoinPoint()")
67 public Object around_method(ProceedingJoinPoint point )
68 或
69 @AfterReturning(value = "getJoinPoint()",returning = "result")
70 public void afterrerutn(JoinPoint joinpoint , Object result)
71
72 XML方式AOP配置 略......