创建一个配置类,开启 AspectJ 的自动代理功能
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.aspectj")
public class DemoAspectJConfig {
// @EnableAspectJAutoProxy 开启注解 aop 功能
// 向 spring 容器中注册 AnnotationAwareAspectJAutoProxyCreator
}
新建接口和接口实现类
// 接口
public interface DemoDao {
void query();
}
// 实现类
@Component
public class DemoDaoImpl implements DemoDao {
@Override
public void query() {
System.out.println("query ......");
}
}
创建一个切面
@Aspect
@Component
public class DemoAspect {
// 配置切点
@Pointcut("execution(* com.aspectj.dao.*.*(..))")
public void point(){
}
// 切点通知
@Before("point()")
public void beforeAdd(){
System.out.println("before-------------");
}
}
创建启动类
public class TestAspect {
public static void main(String[] args) {
// 刷新容器
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(DemoAspectJConfig.class)
// 获取 bean 对象
DemoDao dao = configApplicationContext.getBean(DemoDao.class);
// 代理对象执行
dao.query();
}
}
启动 main() 方法,可以看到输出的内容,AOP 配置方法执行
数组的第一个对象是 ExposeInvocationInterceptor,执行 invoke(),注意入参是 ReflectiveMethodInvocation
数组的第二个对象是 MethodBeforeAdviceInterceptor,执行 invoke()
如果 advisor 有后置处理,就执行第三次递归