是否可以创建具有自动应用于客户端项目中的类的方面的JAR?

Par*_*bay 6 java servlets aspectj spring-aop aspect

我想要一个具有拦截所有方法调用的方面的JAR,例如

@Aspect
public class CoolAspect {
    @Pointcut("execution(public * *(..))")
    public void anyPublicMethod() { }

    @Before("anyPublicMethod()")
    public void advice(JoinPoint point) {
       System.out.println("sign:\t" + point.getSignature());
    }
}
Run Code Online (Sandbox Code Playgroud)

假设以上是我拥有并希望客户使用的方面。我将其编译为JAR并提供给Maven。

现在,客户端将使用此jar作为依赖项,例如

    <dependency>
        <groupId>cool-group</groupId>
        <artifactId>cool-artifact</artifactId>
        <version>1.0.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

该工件(JAR)具有上述方面。

现在可以通过仅声明Maven依赖项来进行方面工作?

几件重要的事情:

  1. 我计划使用AspectJ(如有必要,也许使用Spring AOP),
  2. 客户端可能是正常的Web应用程序web.xml。
  3. 客户端是使用Maven构建的
  4. 我希望客户端尽可能地易于配置-在我最初的想法中,Maven依赖就足够了。
  5. “注释JAR”将包含一个Web片段,因此可以在其中声明一些自定义ServletContextListener。

有任何想法吗?

Mik*_*ail 2

不,这是不可能的,因为 AspectJ 必须在任何客户端类之前启动。所有客户端类都应通过特殊的增强类加载器加载,该加载器将处理注释。

另一件事是Spring的AOP。它在应用程序上下文启动期间编织 bean,并且不需要特殊的类加载器。如果客户使用 spring,这将是最简单的方法。添加maven依赖,然后在应用程序上下文中配置AOP。

编织方式有四种:

  • 编译时编织是最简单的方法。当您拥有应用程序的源代码时,ajc 将从源代码进行编译并生成编织类文件作为输出。编织器的调用是 ajc 编译过程中不可或缺的一部分。方面本身可以是源代码或二进制形式。如果受影响的类需要这些方面才能编译,则必须在编译时编织。例如,当它们向类添加成员并且正在编译的其他类引用添加的成员时,方面是必需的。
  • 编译后编织(有时也称为二进制编织)用于编织现有的类文件和 JAR 文件。与编译时编织一样,用于编织的方面可以是源代码或二进制形式,并且本身可以由方面编织。
  • 加载时编织 (LTW) 是一种简单的二进制编织,延迟到类加载器加载类文件并将类定义到 JVM 为止。为了支持这一点,需要一个或多个“编织类加载器”,它们要么由运行时环境显式提供,要么通过“编织代理”启用。
  • 运行时编织,这就是 Spring 实际所做的事情。我们将其定义为已定义的类的编织。到 JVM