快速入门
开发步骤
- 创建目标接口和目标类(内部有切点)
- 创建切面类(内部有增强方法)
- 将目标类和切面类的对象创建权交给Spring
- 在切面类中注释配置织入关系
- 配置文件中开启扫描和AOP的自动代理
- 测试
目标类
package zcf.anno;
import org.springframework.stereotype.Component;
@Component("target")
public class Target implements TargetInterface {
@Override
public void save() {
System.out.println("save running ... ");
}
}
切面类
package zcf.anno;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component("myAspact")
@Aspect//标注当前MyAspact是一个切面类
public class MyAspact {
// 配置前置通知
@Before("execution( * zcf.anno.*.*(..))")
public void before(){
System.out.println("前置增强。。。。。");
}
public void afterRuning(){
System.out.println("后置增强。。。。。");
}
// ProceedingJoinPoint:正在执行的连接点====切点
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕前增强。。。。。");
Object proceed = proceedingJoinPoint.proceed();//切入点方法
System.out.println("环绕后增强。。。。。");
return proceed;
}
public void aroundThrowing() {
System.out.println("异常增强。。。。。");
}
public void after() {
System.out.println("最终增强。。。。。");
}
}
applicationContext.xml配置文件配置
<!--组件扫描-->
<context:component-scan base-package="zcf"></context:component-scan>
<!-- aop自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
注解配置AOP详情
注解通知类型
- 通知的配置语法:@通知注释(“起点表达式”)
名称 | 注解 | 说明 |
---|---|---|
前置通知 | @Before | 用于配置前置通知。指定增强的方法在切入点方法之前执行 |
后置通知 | @AfterRetuning | 用于配置后置通知。指定增强的方法在切入点方法之后执行 |
环绕通知 | @Around | 用于配置环绕通知。指定增强的方法在切入点方法之前和切入点之后执行 |
异常抛出通知 | @AfterThrowing | 用于配置异常抛出通知。指定增强的方法在出现异常执行 |
最终通知 | @after | 用于配置最终通知。无论增强方式执行是否有异常都会执行 |
切点表达式的抽取
在切面内定义方法,在该方法上使用@Pointcut注释定义切点表达式,然后再在增强注释中进行引用
切面类
package zcf.anno;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component("myAspact")
@Aspect//标注当前MyAspact是一个切面类
public class MyAspact {
// 配置前置通知
@Before("execution( * zcf.anno.*.*(..))")
public void before(){
System.out.println("前置增强。。。。。");
}
@AfterReturning("execution( * zcf.anno.*.*(..))")
public void afterRuning(){
System.out.println("后置增强。。。。。");
}
@Around("execution( * zcf.anno.*.*(..))")
// ProceedingJoinPoint:正在执行的连接点====切点
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕前增强。。。。。");
Object proceed = proceedingJoinPoint.proceed();//切入点方法
System.out.println("环绕后增强。。。。。");
return proceed;
}
@AfterThrowing("MyAspact.pointcut()")
public void aroundThrowing() {
System.out.println("异常增强。。。。。");
}
@After("pointcut()")
public void after() {
System.out.println("最终增强。。。。。");
}
// 定义切点表达式
@Pointcut("execution( * zcf.anno.*.*(..))")
public void pointcut(){}
}