org.aspectj是Java编程语言的一个AOP(面向切面编程)的实现。它是AspectJ工具的一个组成部分,是一个Java语言的扩展,它允许您为Java应用程序中的程序范围添加声明性的、简单、特定的代码。本文将从多个方面对org.aspectj进行详细的阐述。
一、org.aspectj 包
org.aspectj包包含一组AspectJ核心API,它们的目的是为了保持AOP的通用性。其中最重要的两个模块是:aspectjrt.jar
和aspectjweaver.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时会有所帮助。