我有一个Sping Boot 项目,它已经使用了Spring AOP。对于一个新特性,需要使用cflow
切入点,因此必须集成AOP J。
我成功地将Compile Time Weave方面编译到我的项目中,并且可以看到方面运行。我知道当项目有lombok时应该使用loadtime weaving,但我设法使用以下blog运行它。
下面是pom.xml中用于编译时织入的插件。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.14.0</version>
<configuration>
<complianceLevel>11</complianceLevel>
<source>11</source>
<target>11</target>
<showWeaveInfo>true</showWeaveInfo>
<verbose>true</verbose>
<Xlint>ignore</Xlint>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<id>default-compile</id>
<phase>process-classes</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<sources/>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
<forceAjcCompile>true</forceAjcCompile>
<weaveDirectories>
<weaveDirectory>${project.build.directory}/classes</weaveDirectory>
</weaveDirectories>
</configuration>
</execution>
<execution>
<id>default-testCompile</id>
<phase>process-test-classes</phase>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<sources/>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
<forceAjcCompile>true</forceAjcCompile>
<weaveDirectories>
<weaveDirectory>${project.build.directory}/test-classes</weaveDirectory>
</weaveDirectories>
</configuration>
</execution>
</executions>
</plugin>
字符串
aspect的作用是查询带有截获的jointpoint的数据库。为此,我尝试将用@Repository
注解的Spring bean注入到aspect中。由于aspect不是spring组件,我不能在aspect类中@Autowire repository。
Repository类
@Repository
public interface SampleRepository extends JpaRepository<Sample, String> {
}
型
方面类
@Aspect
@Slf4j
public class SampleAspect {
}
型
已尝试的代码为
1.在Aspect上使用@Configurable annotation使aspect成为spring组件。不工作。
@Aspect
@Configurable
@Slf4j
public class SampleAspect {
}
型
1.使用aspectOf函数创建Aspect的bean,并在其中设置存储库bean。不工作。
@Bean
public SampleAspect sampleAspect(){
SampleAspect sampleAspect = Aspects.aspectOf(SampleAspect.class);
sampleAspect.setRepository(sampleRepository);
return sampleAspect;
}
型
在上面的两个步骤中,我都得到了错误unsupported jointpoint cflow。
Initialization of bean failed; nested exception is org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException: contains unsupported pointcut primitive 'cflow'
型
我在这里遗漏了什么吗?我需要向普通的aspectj注入一个bean。
1条答案
按热度按时间sy5wg1nm1#
将您想要
@Autowire
的POJO类作为@Configurable
的依赖项是正确的,即使该类恰好是本机AOP J方面也是如此。然而,将本机方面设置为@Bean
或@Component
是错误的,并且适得其反的方法,因为这将方面第二次注册为Spring AOP方面,这也解释了UnsupportedPointcutPrimitiveException ... cflow
问题。这张图中缺少的信息是,为了让
@Configurable
工作,你需要AnnotationBeanConfigurerAspect
从类路径上的**spring-aspects
。**这对于加载时和编译时编织场景都是正确的。也就是说,你希望在POM中有这样的东西:字符串
在ApplyJ Maven Plugin配置中,您还需要将
spring-aspects
声明为方面库:型
有关详细信息,请参阅this related answer。
稍微偏离主题:我发现在后续阶段中在一个模块中使用MavenMaven和AjenJ Maven的方法,在同一个输出目录上工作,是有问题的,我建议在模块A中使用Maven Observer和Lombok构建一个未编织的模块版本,然后在模块B中将方面编织到来自A的类中。所有其他模块都应该依赖于B,而不是中介A。为了避免A成为一个可传递的依赖项,在类路径上的两个不同版本中具有相同的类,在声明B的依赖项时,给予A
provided
作用域可能是有意义的。