定义切点:
package com.maxjay.bank.advice.aspectj; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; /** * 日志记录 前置增强 * * @author Administrator * */ // 将该类标识为一个切面 @Aspect public class LoggerBeforeAdvisor { /** * 当被代理对象的方法执行前,此方法被执行 * * @param method * 目标类方法 * @param args * 方法的参数 * @param obj * 目标类实例 */ // 定义切点和增强类型,将切点、增强类型及其横切逻辑柔和在了一起。注意此处的execution中*号后必须有空格,否则系统启动会异常。 @Before("execution(* validateUser(..)) && within(com.maxjay.bank.service.impl.*AdviceService)") public void beforeValidate() throws Throwable { System.out.println("日志记录开始,将要运行的方法为"); } }
spring配置文件中添加如下代码:
<bean id="testAdviceService" class="com.maxjay.bank.service.impl.TestAdviceService" /> <!-- 使用AOP进行日志记录,定义增强 --> <bean class="com.maxjay.bank.advice.aspectj.LoggerBeforeAdvisor" /> <!-- 自动代理创建器,自动将@Aspect注解切面类织入到目标bean中 --> <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
如果想象(一)中的增强那样调用代理对象方法中的参数和返回值,我们该怎样做的?
AspectJ也有实现这方面的功能,请看下面的代码:
package com.maxjay.bank.advice.aspectj; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import com.maxjay.bank.model.TSysUser; /** * 日志记录 后置增强 * * @author Administrator * */ @Aspect public class LoggerAfterAdvice{ /** * 当被代理对象的方法执行完后,此方法被执行 * AfterReturning注解表示该方法时后置增强,其参数value指定了匹配规则,用来判断哪些类中哪些方法需要执行该增强;returning则指定了 * 被代理对象的方法执行完成后其返回值用来作为afterReturning中的user参数传递进来。 */ @AfterReturning(value="execution(* validateUser(..)) && within(com.maxjay.bank.service.impl.*AdviceService)", returning="user") public void afterReturning(JoinPoint jp, TSysUser user) throws Throwable { System.out.println("日志记录结束,刚刚运行完成的方法为" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName() + " 返回值为:" + user); } }
afterReturning中的参数jp是传递过来的连接点,其中包含了要代理的对象、方法及方法参数等信息。
spring配置可改为下面的这段:
<bean id="testAdviceService" class="com.maxjay.bank.service.impl.TestAdviceService" /> <!-- 使用AOP进行日志记录,定义增强 --> <bean class="com.maxjay.bank.advice.aspectj.LoggerBeforeAdvisor" /> <bean class="com.maxjay.bank.advice.aspectj.LoggerAfterAdvice" /> <!-- 基于@AspectJ切面的schema驱动器,使用了该方法后可以将上面的自动代理创建器AnnotationAwareAspectJAutoProxyCreator从配置中去除 --> <aop:aspectj-autoproxy />
通过此文就基本了解了@AspectJ的使用方法了。