SpringAOP实现

基于@AspectJ

1、 声明一个切面(aspect)

import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AspectModule {

}

2、 声明一个切入点(PointCut)
切入点(pointcut)有助于确定要用不同通知执行的关联点(即方法)。在使用基于@AspectJ的配置时,切入点声明有两部分:

  • 一个切入点表达式,确定哪些方法执行。
  • 切入点签名包括名称和任意数量的参数。 该方法的实体是无关紧要的,也可以是空的。

以下示例定义了一个名为 businessServicegetname 的切入点,该切入点将匹配com.xyz.myapp.service包下的类中可用的每个方法的执行:

import org.aspectj.lang.annotation.Pointcut;

@Pointcut("execution(* com.xyz.myapp.service.*.*(..))") // expression 
private void businessService() {}  // signature
import org.aspectj.lang.annotation.Pointcut;

@Pointcut("execution(* com.yiibai.Student.getName(..))") 
private void getname() {}

3、声明通知
这个通知就是上篇文章中写到的那五种通知方式,建议代码如下

@Before("businessService()")
public void doBeforeTask(){
 ...
}

@After("businessService()")
public void doAfterTask(){
 ...
}

@AfterReturning(pointcut = "businessService()", returning="retVal")
public void doAfterReturnningTask(Object retVal){
  // you can intercept retVal here.
  ...
}

@AfterThrowing(pointcut = "businessService()", throwing="ex")
public void doAfterThrowingTask(Exception ex){
  // you can intercept thrown exception here.
  ...
}

@Around("businessService()")
public void doAroundTask(){
 ...
}

可以为任何通知定义切入点内嵌,如下

@Before("execution(* com.xyz.myapp.service.*.*(..))")
public doBeforeTask(){
 ...
}

AOP主要应用场景

  1. Authentication 权限
  2. Caching 缓存
  3. Context passing 内容传递
  4. Error handling 错误处理
  5. Lazy loading 懒加载
  6. Debugging 调试
  7. logging, tracing, profiling and monitoring 记录跟踪 优化 校准
  8. Performance optimization 性能优化
  9. Persistence 持久化
  10. Resource pooling 资源池
  11. Synchronization 同步
  12. Transactions 事务

玛卡巴卡
1 声望2 粉丝

后端开发


« 上一篇
SpringAOP -01
下一篇 »
Java集合总结