Spring 即使在为编译时编织添加aspectj maven插件之后,自调用AOP问题仍然存在
我希望使用AOP登录我们的项目。我所面临的问题是,如果一个类的一个方法正在调用它内部同一个类的另一个方法,那么AOP将无法处理该调用,因为它采用代理方式。为了解决这个问题,我尝试使用aspectj maven插件进行编译时编织。我的顶级项目pom如下所示:Spring 即使在为编译时编织添加aspectj maven插件之后,自调用AOP问题仍然存在,spring,maven,aspectj,aop,aspectj-maven-plugin,Spring,Maven,Aspectj,Aop,Aspectj Maven Plugin,我希望使用AOP登录我们的项目。我所面临的问题是,如果一个类的一个方法正在调用它内部同一个类的另一个方法,那么AOP将无法处理该调用,因为它采用代理方式。为了解决这个问题,我尝试使用aspectj maven插件进行编译时编织。我的顶级项目pom如下所示: <dependencies> <dependency> <groupId>org.aspectj</groupId> <ar
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<complianceLevel>1.7</complianceLevel>
<source>1.7</source>
<target>1.7</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.1</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
目标文件具有如下处理方法:
process() {
internalMethod();
}
因为我已经评论了autoproxy部分,所以我要说的是不要使用代理。但是,现在不会显示任何日志(无论是在调用process方法时还是在调用internalMethod时)。如果启用了autoproxy,则会显示process method的日志,但不会显示internalMethod的日志,这是可以理解的。在解决此问题一天后,解决方案非常奇怪。我进行了逐步调试,结果如下:
因此,只要我完成了一个更新maven项目,.class文件就会以某种方式恢复到一种状态,在这种状态下,它不会与方面代码交织在一起。刷新项目而不是更新maven project解决了我的问题,但我无法理解其原因。能否提供一个简洁、最少、可复制的版本?Maven配置很有趣,但是实际的代码和Spring配置呢?它可能会帮助别人帮助你。:-)@我对kriegaex进行了编辑,并做了一些相关修改。我只想做编译时编织。为了让AspectJ编译器“看到”您的方面,它们或者需要与您想要将它们编织到的代码位于同一个Maven模块中,或者您需要配置AspectJ Maven插件,以便在另一个模块中找到它们作为编织依赖项,因为Codehaus已经关闭了它的大门,目前正在迁移到Mojohaus,那里仍然没有插件文档页面,但我发现了一个。
@Named
@Aspect
public class LoggingAspect {
@Before("execution(public * com.relevant.package.*.process(..))")
public void beforeProcessAdvice() {
System.out.println("AOP");
System.out.println("Before");
}
@Before("execution(public * com.relevant.package.*.internalMethod(..))")
public void beforeProcessAdvice() {
System.out.println("Internal");
System.out.println("Method");
}
}
process() {
internalMethod();
}