Spring AOP 实践(五)基础篇下
来源:互联网 发布:python中的 编辑:程序博客网 时间:2024/05/17 03:21
Spring支持的AspectJ切入点指示词:
execution:匹配一个方法的执行,最常用的一个;
within:匹配在一个包或者类型中;
this:匹配一个这个类型的proxy;
target:匹配一个这个类型的目标对象--被代理的对象;
args:匹配一个方法,参数是这个类型;
组合切入点:
@Pointcut("execution(public * *(..))")private void anyPublicOperation() {}@Pointcut("within(com.xyz.someapp.trading..*)")private void inTrading() {}@Pointcut("anyPublicOperation() && inTrading()")private void tradingOperation() {}
第一个切入点的定义用到了execution,指任何public的方法的执行;第二个切入点的定义用到了within,指在指定的包内;第三个切入点的定义则组合了两者,指在特定包中的任何public方法。
within(com.xyz.service.*)within(com.xyz.service..*)这两个within的区别在于,第二个包含了service这个包的子包,而第一个只是service这个包下面的所有类的意思。
this(com.xyz.service.AccountService)指代任何继承了AccountService这个接口的proxy;
target(com.xyz.service.AccountService)指代任何继承了AccountService这个接口的目标类;
args(java.io.Serializable)任何以实现了Serializable接口的类为参数的切入点;
@target(org.springframework.transaction.annotation.Transactional)目标对象有@Transactional的任何切入点;
@within(org.springframework.transaction.annotation.Transactional)目标对象的声明类型中有@Transactional的任何切入点;
@annotation(org.springframework.transaction.annotation.Transactional)执行的方法有@Transactional定义的任何切入点;
@args(com.xyz.security.Classified)切入点只有一个参数,而且参数的类型有@Classified注解;
bean(tradeService)任何定义在tradeService这个Bean中的切入点;
bean(*Service)同上,只是bean的名字使用了通配符;
在切面中访问目标对象/目标方法的参数,返回值等:
@AfterReturning( pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()", returning="retVal") public void doAccessCheck(Object retVal) { // ... }
@AfterThrowing( pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()", throwing="ex") public void doRecoveryActions(DataAccessException ex) { // ... }以上第一个例子访问目标方法的返回值,第二个方法访问发生的异常。
@Around("com.xyz.myapp.SystemArchitecture.businessService()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch Object retVal = pjp.proceed(); // stop stopwatch return retVal; }
使用ProceedingJoinPoint这个类可以获得目标方法的返回值,还可以获得目标对象:
Object target = pjp.getTarget();或者目标方法的签名等:
String methodName = pjp.getSignature().getName();org.aspectj.lang.JoinPoint类除了不能proceeding外其他功能和ProceedingJoinPoint相同;
@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() && args(account,..)")public void validateAccount(Account account) { // ...}也可以这样访问目标对象的参数。
@Before("com.xyz.lib.Pointcuts.anyPublicMethod() && @annotation(auditable)")public void audit(Auditable auditable) { AuditCode code = auditable.value(); // ...}访问目标方法的注解。
具体实例可参见本系列的第二篇和第四篇。
0 0
- Spring AOP 实践(五)基础篇下
- Spring AOP实践(三)基础篇上
- spring知识五------AOP基础
- Spring(五)AOP
- Spring AOP实践(二)编程篇
- Spring源码阅读(五)—AOP基础
- Spring框架 AOP (五)
- Spring详解(五)------AOP
- Spring AOP(下)
- Spring(基础)学习文档五(spring的aop详解)
- spring的AOP(五)----Spring AOP 编程(AspectJ )
- Spring AOP 基础(一)
- Spring AOP 基础(二)
- Spring实践:面向切面编程(AOP)
- Spring AOP实践
- spring aop 实践
- spring AOP 最佳实践
- Spring 实践 -AOP
- Python与Java交互
- 数据库订单表状态字段值设计的一些思考
- JPA和Hibernate浅析
- Android内存优化建议
- 自己写bootloader笔记8---反汇编文件boot.dis分析
- Spring AOP 实践(五)基础篇下
- 如何退出Activity?如何安全退出已调用多个Activity的Application?
- MediaCodec解码h264流
- Linux系统利用脚本删除空行或者空格的方法
- DFS-PATA-1003
- 电商样衣领用
- 【分享】泽越止系列游戏ら~じPonPon+SummerRadishVacation!【日文硬盘版】[
- 安卓TimePicker在当前页面通过按键事件切换焦点的方法
- JAVASRCIPT 学习跟踪