Spring AOP基于注解的“零配置”方式实现
本文内容纲要:Spring AOP基于注解的“零配置”方式实现
- 为了在Spring中启动@AspectJ支持,需要在类加载路径下新增两个AspectJ库:aspectjweaver.jar和aspectjrt.jar。除此之外,Spring AOP还需要依赖一个aopalliance.jar包
- 定义一个类似ServiceAspect.java这样的切面bean:
- 1 package com.hyq.aop;- 2 - 3 import org.apache.commons.logging.Log; - 4 import org.apache.commons.logging.LogFactory; - 5 import org.aspectj.lang.JoinPoint; - 6 import org.aspectj.lang.ProceedingJoinPoint; - 7 import org.aspectj.lang.annotation.After; - 8 import org.aspectj.lang.annotation.AfterReturning; - 9 import org.aspectj.lang.annotation.AfterThrowing; - 10 import org.aspectj.lang.annotation.Around; - 11 import org.aspectj.lang.annotation.Aspect; - 12 import org.aspectj.lang.annotation.Before; - 13 import org.aspectj.lang.annotation.Pointcut; - 14 import org.springframework.stereotype.Component; - 15 - 16 /** - 17 * 系统服务组件Aspect切面Bean - 18 * @author Shenghany - 19 */ - 20 //声明这是一个组件 - 21 @Component - 22 //声明这是一个切面Bean - 23 @Aspect - 24 public class ServiceAspect { - 25 - 26 private final static Log log = LogFactory.getLog(ServiceAspect.class); - 27 - 28 //配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点 - 29 @Pointcut("execution(* com.hyq.aop..*(..))") - 30 public void aspect(){ } - 31 - 32 /* - 33 * 配置前置通知,使用在方法aspect()上注册的切入点 - 34 * 同时接受JoinPoint切入点对象,可以没有该参数 - 35 */ - 36 @Before("aspect()") - 37 public void before(JoinPoint joinPoint){ - 38 System.out.println("执行before....."); - 39 } - 40 - 41 //配置后置通知,使用在方法aspect()上注册的切入点 - 42 @After("aspect()") - 43 public void after(JoinPoint joinPoint){ - 44 System.out.println("执行after....."); - 45 } - 46 - 47 //配置环绕通知,使用在方法aspect()上注册的切入点 - 48 @Around("aspect()") - 49 public void around(JoinPoint joinPoint){ - 50 long start = System.currentTimeMillis(); - 51 try { - 52 ((ProceedingJoinPoint) joinPoint).proceed(); - 53 long end = System.currentTimeMillis(); - 54 if(log.isInfoEnabled()){ - 55 log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms!"); - 56 } - 57 } catch (Throwable e) { - 58 long end = System.currentTimeMillis(); - 59 if(log.isInfoEnabled()){ - 60 log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + e.getMessage()); - 61 } - 62 } - 63 } - 64 - 65 //配置后置返回通知,使用在方法aspect()上注册的切入点 - 66 @AfterReturning("aspect()") - 67 public void afterReturn(JoinPoint joinPoint){ - 68 if(log.isInfoEnabled()){ - 69 log.info("afterReturn " + joinPoint); - 70 } - 71 } - 72 - 73 //配置抛出异常后通知,使用在方法aspect()上注册的切入点 - 74 @AfterThrowing(pointcut="aspect()", throwing="ex") - 75 public void afterThrow(JoinPoint joinPoint, Exception ex){ - 76 if(log.isInfoEnabled()){ - 77 log.info("afterThrow " + joinPoint + "\t" + ex.getMessage()); - 78 } - 79 } - 80 - 81 } - 3.定义一个业务组件,如: 
- 1 package com.hyq.aop;- 2 - 3 import org.apache.commons.logging.Log; - 4 import org.apache.commons.logging.LogFactory; - 5 import org.springframework.stereotype.Component; - 6 @Component() - 7 public class UserService { - 8 - 9 private final static Log log = LogFactory.getLog(UserService.class); - 10 - 11 public User get(long id){ - 12 if(log.isInfoEnabled()){ - 13 log.info("getUser method . . ."); - 14 } - 15 return new User(); - 16 } - 17 - 18 public void save(User user){ - 19 if(log.isInfoEnabled()){ - 20 log.info("saveUser method . . ."); - 21 } - 22 } - 23 - 24 public boolean delete(long id) throws Exception{ - 25 if(log.isInfoEnabled()){ - 26 log.info("delete method . . ."); - 27 throw new Exception("spring aop ThrowAdvice演示"); - 28 } - 29 return false; - 30 } - 31 - 32 } - 业务组件要用@Component()注解修饰 
4.在bean.xml中加入下面配置:
1 <!-- 激活组件扫描功能,在包com.hyq.aop及其子包下面自动扫描通过注解配置的组件 -->2     <context:component-scan base-package="com.hyq.aop"/>
3     <!-- 激活自动代理功能 -->
4     <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
5     <aop:aspectj-autoproxy/>
本文内容总结:Spring AOP基于注解的“零配置”方式实现
原文链接:https://www.cnblogs.com/zest/p/5883866.html
以上是 Spring AOP基于注解的“零配置”方式实现 的全部内容, 来源链接: utcz.com/z/296919.html








