您的位置:首页 > 编程语言 > Java开发

spring核心之AOP学习总结二

2016-12-07 21:15 465 查看
一:springAOP常用的注解

@Aspect:声明方面组件

@Before:声明前置通知

@After-returning:声明后置通知

@After:声明最终通知

@Around:声明环绕通知

@After-throwing:声明异常通知

二:使用SpringAOP的注解对总结一中的案例进行重构

1:注释掉方面组件的声明以及将方面组件应用到目标组件的配置

1 <!-- 配置日志组件
2     <bean id="operatorLogger" class="com.hlcui.aspect.OperatorLogger"></bean>
3
4      配置方面组件
5     <aop:config>
6         <aop:aspect ref="operatorLogger">
7             <aop:before method="logger" pointcut="within(com.hlcui.controller..*)"/>
8         </aop:aspect>
9
10         <aop:aspect ref="operatorLogger">
11             <aop:around method="logger2" pointcut="within(com.hlcui.controller..*)"/>
12         </aop:aspect>
13
14         <aop:aspect ref="operatorLogger">
15             <aop:after-throwing method="logger3" throwing="e" pointcut="within(com.hlcui.controller..*)"/>
16         </aop:aspect>
17     </aop:config>-->
18
19     <!-- 开启SpringAOP的注解扫描 -->
20     <aop:aspectj-autoproxy proxy-target-class="true"/>


2:使用@Aspect注解声明方面组件,并且在方面组件上面声明前置、后置或者是环绕通知

1 /**
2  *
3  */
4 package com.hlcui.aspect;
5
6 import java.text.SimpleDateFormat;
7 import java.util.Date;
8
9 import org.aspectj.lang.ProceedingJoinPoint;
10 import org.aspectj.lang.annotation.AfterThrowing;
11 import org.aspectj.lang.annotation.Around;
12 import org.aspectj.lang.annotation.Aspect;
13 import org.aspectj.lang.annotation.Before;
14 import org.springframework.stereotype.Component;
15
16
17 /**
18  * @author Administrator
19  *
20  */
21 @Aspect
22 @Component
23 public class OperatorLogger {
24
25     @Before("within(com.hlcui.controller..*)")
26     public void logger(){
27         System.out.println("-->记录用户日志");
28     }
29
30     @Around("within(com.hlcui.controller..*)")
31     public Object logger2(ProceedingJoinPoint p ) throws Throwable{
32         String targetName = p.getTarget().getClass().getName();
33         String methodName = p.getSignature().getName();
34         String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
35         String msg = date+"执行"+targetName+methodName;
36         System.out.println(msg);
37         Object obj = p.proceed();
38         System.out.println("调用目标组件业务方法后");
39         return obj;
40     }
41
42     @AfterThrowing(pointcut="within(com.hlcui.controller..*)",throwing="e")
43     public void logger3(Exception e){
44         StackTraceElement[] eles = e.getStackTrace();
45         System.out.println(eles[0].toString());
46     }
47 }


3:运行测试方法



通过结果可以看出,通过注解声明方面组件成功切入目标组件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: