记录对于Aspect的一些自己的理解和认知。
/** * 日志的AOP实现 * * @author scott.lee * */ @Component @Aspect public class LogAopAchieve { private static final long serialVersionUID = 1L; private static final Logger LOG = Logger.getLogger(LogAopAchieve.class); // 所有在com.yoouce.ycecs下的类 @Before("execution(* com.yoouce.ycecs.*.*(..))") public void doBefore(JoinPoint jp) { LOG.info("log Begining method: " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName()); } // 方法执行后调用 @After("execution(* com.yoouce.ycecs.*.*(..))") public void doAfter(JoinPoint jp) { LOG.info("log Ending method: " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName()); } // 方法执行的前后调用 @Around("execution(* com.yoouce.ycecs.*.*(..))") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { long time = System.currentTimeMillis(); Object retVal = pjp.proceed(); time = System.currentTimeMillis() - time; LOG.info("process time: " + time + " ms"); return retVal; } // 方法运行出现异常时调用 @AfterThrowing("execution(* com.yoouce.ycecs.*.*(..))") public void doThrowing(JoinPoint jp, Throwable ex) { LOG.info("method " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName() + " throw exception"); LOG.info(ex.getMessage()); } }
execution 用于匹配方法执行的连接点;
within 用于匹配指定类型内的方法执行;
this 用于匹配当前 AOP 代理对象类型的执行方法; 注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
target 用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;
args 用于匹配当前执行的方法传入的参数为指定类型的执行方法;
@within 用于匹配所以持有指定注解类型内的方法;
@target 用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;
@args 用于匹配当前执行的方法传入的参数持有指定注解的执行;
@annotation 用于匹配当前执行方法持有指定注解的方法;
bean Spring AOP扩展的, AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;
reference pointcut: 表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持。
配置文件如下
<!--aspect AOP切面配置 --> <aop:config proxy-target-class="true" /> <aop:config> <aop:aspect id="LogAopAchieve" ref="aspectBean"> <!--配置com.spring.service包下所有类或接口的所有方法 --> <aop:pointcut expression="execution(* com.yoouce.ycecs..*.*(..))" id="logPointCut" /> <aop:before method="doBefore" pointcut-ref="logPointCut" /> <aop:after method="doAfter" pointcut-ref="logPointCut" /> <aop:around method="doAround" pointcut-ref="logPointCut" /> <aop:after-throwing method="doThrowing" throwing="ex" pointcut-ref="logPointCut" /> </aop:aspect> </aop:config> <bean id="aspectBean" class="com.yoouce.yclab.aop.LogAopAchieve" />
pointcut基于正则的语法,也支持通配符,含义如下:
* 表示任何数量的字符,除了(.)
.. 表示任何数量的字符包括任何数量的(.)
+ 描述指定类型的任何子类或者子接口
同java一样,提供了一元和二元的条件表达操作符。
一元操作符:!
二元操作符:||和&&
优先权同java