深入剖析org.aspectj

发布时间:2023-05-18

org.aspectj是Java编程语言的一个AOP(面向切面编程)的实现。它是AspectJ工具的一个组成部分,是一个Java语言的扩展,它允许您为Java应用程序中的程序范围添加声明性的、简单、特定的代码。本文将从多个方面对org.aspectj进行详细的阐述。

一、org.aspectj 包

org.aspectj包包含一组AspectJ核心API,它们的目的是为了保持AOP的通用性。其中最重要的两个模块是:aspectjrt.jaraspectjweaver.jar。其中,aspectjrt.jar包含了最基本的AspectJ APIs,包括Runtime支持、基本数据结构等。

    <!-- aspectj核心包 -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.13</version>
    </dependency>

另一个主要的包就是aspectjweaver.jar,该包包含了一个Java编译器的扩展,可以识别AspectJ的语言扩展与语法,它可以支持在Java代码中嵌入AspectJ的横切关注点。

    <!-- aspectj编译时依赖 -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.13</version>
        <scope>provided</scope>
    </dependency>

二、org.aspectj依赖爆红

org.aspectj的开发需要导入_aspectjrt.jar和_aspectjweaver.jar等多个JAR包。这样就容易造成传统的打包方式(将这些JAR包lib下复制到打包的JAR文件中)时,动态classloader取父ClassLoader中的类而抛出ClassNotFoundException的问题,即导致编译上下文与运行上下文不一致的问题。解决方法是为org.aspectj制作一个FatJAR文件,将所有的依赖项都打包到同一JAR文件中。

    <!-- aspectj FatJar -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <tarLongFileMode>posix</tarLongFileMode>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>

三、org.aspectj不存在

org.aspectj的开发需要加入相关的插件,但在一些IDE中,org.aspectj插件未被默认加载,需要手动安装。

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.11</version>
        <executions>
            <execution>
                <goals>
                    <goal>compile</goal>
                    <goal>test-compile</goal>
                </goals>
            </execution>
        </executions>
    </dependency>

四、org.aspectj.lang.annotation

org.aspectj.lang.annotation包定义了一组注释,以简单和方便的方式将方面应用于Java类,方法和属性。从功能上来说,在使用Java 5注释的情况下,AspectJ注释分别起到描述性元素(AspectJ定义通知的方法)和元数据元素(Element注解指定元数据)的作用。 下面是一个使用@Aspect注释的简单例子:

import org.aspectj.lang.annotation.*;
import org.aspectj.lang.*;
@Aspect
public class ExampleAspect
{
    @Pointcut("execution(* example.Example.method(..))")
    public void exampleMethod() {}
    @After("exampleMethod()")
    public void intercept() {
        //处理中间代码
    }
}

五、org.aspectj.lang.JoinPoint

org.aspectj.lang.JoinPoint包含有关连接点的信息。连接点是在执行应用程序时AOP切面接收通知的特定点,例如调用构造函数或调用方法。

import org.aspectj.lang.annotation.*;
import org.aspectj.lang.*;
@Aspect
public class ExampleAspect
{
    @Pointcut("execution(* example.Example.method(..))")
    public void exampleMethod() {}
    @After("exampleMethod()")
    public void intercept(JoinPoint jp) {
        //打印连接点相关信息
        System.out.println("Signature: " + jp.getSignature());
        System.out.println("Args: " + Arrays.toString(jp.getArgs()));
        //处理中间代码
    }
}

六、org.aspectj.lang不存在

在使用AspectJ时,如果没有定义真实的pointcuts,那么直接使用@AspectJ注释就会导致问题。在编写代码时,需要确保org.aspectj.lang包可用。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class ExampleAspect
{
    @Around("execution(* example.Example.method(..))")
    public Object intercept(ProceedingJoinPoint pjp) throws Throwable {
        //处理中间代码
        Object result = pjp.proceed();
        //处理中间代码
        return result;
    }
}

结束语

本文详细介绍了org.aspectj的多个方面,包括其基本API、依赖问题、包和注释等。希望这些信息对于您在使用org.aspectj时会有所帮助。