在maven项目中使用aspectj

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.java.aspectj</groupId>
	<artifactId>aspectj-test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>aspectj-test</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.9.1</version>
		</dependency>

	</dependencies>
	<build>
	
		<plugins>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>aspectj-maven-plugin</artifactId>
				<version>1.11</version>
				<executions>
					<execution>
						<goals>
							<goal>compile</goal>       <!-- use this goal to weave all your main classes -->
							<goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
		<pluginManagement>
			<plugins>
				<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
				<plugin>
					<groupId>org.eclipse.m2e</groupId>
					<artifactId>lifecycle-mapping</artifactId>
					<version>1.0.0</version>
					<configuration>
						<lifecycleMappingMetadata>
							<pluginExecutions>
								<pluginExecution>
									<pluginExecutionFilter>
										<groupId>
											org.codehaus.mojo
										</groupId>
										<artifactId>
											aspectj-maven-plugin
										</artifactId>
										<versionRange>
											[1.11,)
										</versionRange>
										<goals>
											<goal>test-compile</goal>
										</goals>
									</pluginExecutionFilter>
									<action>
										<ignore></ignore>
									</action>
								</pluginExecution>
							</pluginExecutions>
						</lifecycleMappingMetadata>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>

其中要用到aspectj-maven-plugin插件。

aspectj文件——*.aj文件在maven项目中会有红叉,不知道什么原因,将红叉删掉就好了


编译前后的文件对比

编译前:

package com.java.aspectj;

public class Hello {
	public void hello(String name) {
        System.out.println(name+",hello!");
    }
}
package com.java.aspectj;


public aspect HelloWorld {
	/**
     * 第一个*号是指返回值不限,第二个*号是指方法名不限
     * 括号只是任意个数类型不限的形参
     */
	before() : call(* com.java.aspectj.*.*(..)) {
        System.out.println("hello前的检查,哈哈");
    }
    after() : call(* com.java.aspectj.*.*(..)) {
        System.out.println("hello后的检查,哈哈");
    }
}


package com.java.aspectj;

public class Test {

	public static void main(String[] args) {
		System.out.println("main ");
		Hello hello = new Hello();
        hello.hello("张三");
        System.out.println("main ");
	}

}

编译后:

package com.java.aspectj;

import java.io.PrintStream;

public class Hello
{
  public void hello(String name)
  {
    System.out.println(name + ",hello!");
  }
}
package com.java.aspectj;

import java.io.PrintStream;
import org.aspectj.lang.NoAspectBoundException;

public class HelloWorld
{
  private static Throwable ajc$initFailureCause;
  public static final HelloWorld ajc$perSingletonInstance;
  
  public static boolean hasAspect()
  {
    return ajc$perSingletonInstance != null;
  }
  
  private static void ajc$postClinit()
  {
    ajc$perSingletonInstance = new HelloWorld();
  }
  
  public static HelloWorld aspectOf()
  {
    if (ajc$perSingletonInstance == null) {
      throw new NoAspectBoundException("com_java_aspectj_HelloWorld", ajc$initFailureCause);
    }
    return ajc$perSingletonInstance;
  }
  
  static
  {
    try
    {
      
    }
    catch (Throwable localThrowable)
    {
      ajc$initFailureCause = localThrowable;
    }
  }
  
  public void ajc$before$com_java_aspectj_HelloWorld$1$4be4d41d()
  {
    System.out.println("hello前的检查,哈哈");
  }
  
  public void ajc$after$com_java_aspectj_HelloWorld$2$4be4d41d()
  {
    System.out.println("hello后的检查,哈哈");
  }
}
package com.java.aspectj;

import java.io.PrintStream;

public class Test
{
  public static void main(String[] args)
  {
    System.out.println("main ");
    Hello hello = new Hello();
    try
    {
      HelloWorld.aspectOf().ajc$before$com_java_aspectj_HelloWorld$1$4be4d41d();hello.hello("张三");
    }
    catch (Throwable localThrowable)
    {
      HelloWorld.aspectOf().ajc$after$com_java_aspectj_HelloWorld$2$4be4d41d();throw localThrowable;
    }
    HelloWorld.aspectOf().ajc$after$com_java_aspectj_HelloWorld$2$4be4d41d();
    System.out.println("main ");
  }
}

执行结果:



说明:我的eclipse是安装了AJDT插件。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要在 Maven 项目使用 AspectJ,您需要进行以下步骤: 1. 首先,在您的 Maven 项目的 `pom.xml` 文件添加 AspectJ Maven 插件的配置。在 `<build>` 标签下的 `<plugins>` 添加以下内容: ```xml <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.12.6</version> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <configuration> <source>1.8</source> <!-- 设置您项目的 Java 版本 --> <target>1.8</target> <!-- 设置您项目的目标 Java 版本 --> <complianceLevel>1.8</complianceLevel> <!-- 设置 AspectJ 编译器的兼容性级别 --> </configuration> </plugin> ``` 2. 接下来,在您的项目创建一个 `src/main/aspect` 目录,并在其编写您的 AspectJ 切面类。例如,您可以创建一个名为 `LoggingAspect` 的类,并在其定义一些切面逻辑。 3. 在您的项目使用 AspectJ 注解或 XML 文件来指定切点和通知。您可以在切面类使用 `@Aspect` 注解,并通过 `@Pointcut` 注解定义切点,然后使用各种通知注解(如 `@Before`、`@After` 等)来指定切面逻辑。 4. 构建和运行您的项目。您可以使用 `mvn compile` 命令编译您的项目,并使用 `mvn test` 命令运行您的测试。AspectJ Maven 插件会在编译过程织入切面逻辑。 这就是使用 MavenAspectJ 的基本步骤。希望对您有所帮助!如果您有任何其他问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值