码迷,mamicode.com
首页 > 编程语言 > 详细

spring核心之AOP学习总结二

时间:2016-12-07 22:43:57      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:for   getname   异常   throws   spec   日志   mat   new   ann   

一: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:运行测试方法

技术分享

通过结果可以看出,通过注解声明方面组件成功切入目标组件。

spring核心之AOP学习总结二

标签:for   getname   异常   throws   spec   日志   mat   new   ann   

原文地址:http://www.cnblogs.com/warrior4236/p/6142827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!