我在使用LoadTimeWiven策略将AspectJ与SpringBoot集成时遇到了很多问题(因为SpringAOP不适合我的情况)。
我配置了以下许多指南AspectJ。以下是我在与pom AspectJ相关的
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${ascpectj.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${ascpectj.version}</version>
</dependency>
这是我的aop。xml
<aspectj>
<weaver options="-showWeaveInfo -debug -Xlintfile:pathToAResource -verbose">
<include within="foo.*"/>
</weaver>
<aspects>
<aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
<aspect name="org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect"/>
<aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
<aspect name="org.springframework.cache.aspectj.AnnotationCacheAspect"/>
<aspect name="it.poste.energy.aspects.TaskAspect"/>
</aspects>
</aspectj>
我确信它在项目结构中的位置是正确的,因为它实际上是在读取weaver标记中传递的选项(我知道xlintoption显然不正确,但我认为现在它并不重要)java
我在基本配置类上配置了自定义LoadTimeWeaver,如下所示:
@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class CustomLoadTimeWeaverConfig implements LoadTimeWeavingConfigurer {
@Override
@NonNull
public LoadTimeWeaver getLoadTimeWeaver() {
return new TomcatLoadTimeWeaver();
}
@Bean
public InstrumentationLoadTimeWeaver loadTimeWeaver() throws Throwable {
return new InstrumentationLoadTimeWeaver();
}
}
然后,我启动Spring应用程序,传递以下2个用于java代理的vm参数-javaagent: C:\用户\foo-user. m2\repository\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar-javaagent: C:\用户\foo-user. m2\repository\org\springFramework\spring-Instrt-5.2.10。RELEASE\spring-Instrt-5.2.10。RELEASE. jar
(我尝试删除Spring仪器的地方建议和EnableLoadTimeWeave注释,但没有改变)
该应用程序启动良好,但它并没有在aop中编织一个包含包的类。xml。这是weaver调试日志的一个示例
[URLClassLoader@1efee8e7] debug not weaving 'foo.energy.domain.client.crmu.Foo1'
[URLClassLoader@1efee8e7] debug not weaving 'foo.energy.domain.client.crmu.Foo2'
[URLClassLoader@1efee8e7] debug not weaving 'foo.energy.domain.client.Foo3'
[URLClassLoader@1efee8e7] debug not weaving 'fooo.energy.domain.client.Foo4'
让我感到困扰的是,它正确地注册了所有方面,因此:
[InspectionClassLoader@3db65c0d] info AspectJ Weaver Version 1.9.6 built on Tuesday Jul 21, 2020 at 13:30:08 PDT
[InspectionClassLoader@3db65c0d] info register classloader org.springframework.data.jpa.repository.config.InspectionClassLoader@3db65c0d
[InspectionClassLoader@3db65c0d] info using configuration /C:/Work/Workspaces/foo-project/target/classes/META-INF/aop.xml
[InspectionClassLoader@3db65c0d] info using configuration file:/C:/Users/foo-user/.m2/repository/org/springframework/spring-aspects/5.2.10.RELEASE/spring-aspects-5.2.10.RELEASE.jar!/META-INF/aop.xml
[InspectionClassLoader@3db65c0d] warning Cannot access resource for -Xlintfile:pathToAResource
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.cache.aspectj.AnnotationCacheAspect
[InspectionClassLoader@3db65c0d] info register aspect foo.energy.aspects.TaskAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.transaction.aspectj.JtaAnnotationTransactionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.cache.aspectj.AnnotationCacheAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.cache.aspectj.JCacheCacheAspect
[InspectionClassLoader@3db65c0d] info deactivating aspect 'org.springframework.cache.aspectj.JCacheCacheAspect' as it requires type 'org.springframework.cache.jcache.interceptor.JCacheAspectSupport' which cannot be found on the classpath
[InspectionClassLoader@3db65c0d] info deactivating aspect 'org.springframework.cache.aspectj.JCacheCacheAspect' as it requires type 'javax.cache.annotation.CacheResult' which cannot be found on the classpath
问题是这些最后一行日志(方面的注册)被调用了3/4次,我不知道它是否异常或什么
我错过什么了吗?
SN:我正在使用Spring Boot v2.3.5。RELEASE,Spring v5.2.10。对于aspectjrt和aspectjweaver,RELEASE和tomcat 9.0.39和1.9.6
请注意,foo.*
仅直接匹配foo包中的类,而不是子包中的类。为此,您需要foo...*
。因此,您应该替换
<include within="foo.*"/>
通过
<include within="foo..*"/>
我想知道为什么这么多指南使用com.*
来编织子包。
我称这种现象为“复制”
但我的问题是,如果它不使用AspectJ进行编织,那么Spring AOP是否有自己的编织,它是在加载时还是编译时执行? 我的Spring配置XML文件的相关部分是:
如果我使用的是基于AspectJ的Spring AOP,那么我是否需要配置我的方面来使用加载时间编织?或者Spring AOP在使用基于AspectJ的方法时也支持运行时/编译时编织吗?
我需要创建Gradle任务,它可以在Gradle构建之前替换.java文件。分级在.war文件中构建包应用程序。我需要在构建后替换字节码。我试过sourceSets Gradle任务,但它只能排除文件。 但我需要在同一地方也包括文件。我怎么能和Gradle在一起?
这意味着我们正在使用编译时编织。 哪一个优先?使用的是编译时编织,还是代理?
我想请你帮忙。我有两张桌子。在表1中,我有client_num和personal data。我想把tab1和tab2连接起来,其中也有client_nums,但一个客户机号可以在更多行上。本表2的第二列是以数字1-5写成的产品。 表1 CLIENT_NUM;性别 表2 CLIENT_NUM;产品 现在我只想要那些没有4号产品的客户 你能帮我一下吗?谢谢
阅读文档(链接)时,我很难理解这些段落(可能也是因为英语不是我的母语)。 首先,我读 此外,在某些环境中,这种支持允许加载时编织,而不需要对应用程序服务器的启动脚本进行任何修改,以添加或(如我们在本节后面所述)(以前命名为)。 而且 哪些档案?类和文件? 然后,在同一子章中描述一个例子时,他们说 我们还有最后一件事要做。本节的介绍确实说过,可以在Spring的每个基础上有选择地打开LTW,这是事实