春季AOP - 为什么我需要aspectjweaver?

2022-09-01 05:22:35

我用Spring AOP写了一个非常简单的方面。它有效,但我有一些问题理解到底发生了什么。我不明白为什么我必须添加aspectajweaver.jar?Spring-AOP文档明确指出,只要我只使用Spring-AOP,我就不需要aspectj编译器或编织器:

AOP运行时仍然是纯Spring AOP,并且不依赖于AspectJ编译器或编织器。

我的配置如下所示:

<aop:aspectj-autoproxy />

@Aspect
@Service
public class RemoteInvocationAspect {

    @Before("execution(* at.test.mypackage.*.*(..))")
    public void test() {
        System.out.println("test");
    }
    ...

我也尝试了XML配置,但没有改变任何东西。也许我可以放手,但我真的很想了解为什么使用aspectj-weaver?如果我不添加maven中的依赖项,我得到java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException


答案 1

我认为Spring AOP实现正在重用aspectj-weaver中的一些类。它仍然使用动态代理 - 不做字节码修改。

春季论坛的以下评论可能会澄清。

在这种情况下,Spring没有使用AspectJ编织器。它只是重用了aspectjweaver.jar中的一些类。

-拉米尼瓦斯


答案 2

您正在使用 AspectJ 风格的切入点表达式,并且是 AspectJ 的一部分。检查此链接@Aspect@Before

关于 ,它实际上是一个字节码编织器,它在加载时将各个方面编织到类中AspectJ-weaver


推荐