SpringAOP实现
基于@AspectJ
1、 声明一个切面(aspect)
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AspectModule {
}
2、 声明一个切入点(PointCut)
切入点(pointcut)有助于确定要用不同通知执行的关联点(即方法)。在使用基于@AspectJ的配置时,切入点声明有两部分:
- 一个切入点表达式,确定哪些方法执行。
- 切入点签名包括名称和任意数量的参数。 该方法的实体是无关紧要的,也可以是空的。
以下示例定义了一个名为 businessService 和getname 的切入点,该切入点将匹配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主要应用场景
- Authentication 权限
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging, tracing, profiling and monitoring 记录跟踪 优化 校准
- Performance optimization 性能优化
- Persistence 持久化
- Resource pooling 资源池
- Synchronization 同步
- Transactions 事务
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。