Spring 未调用 AspectJ loadtimeweaving
Spring AspectJ loadtimeweaving not invoked
SpringAspectJ 加载时编织配置正在构建和加载服务器,没有任何错误,但是方面没有被调用。
这是配置列表
1) JDK 8
2) 服务器码头
@Configuration
@ComponentScan(basePackages = {..})
@EnableSpringConfigured
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
@PropertySource(...)
@ImportResource(value = { "classpath:META-INF/aop.xml", ..})
class config {
...
}
aop.xml
<aspectj>
<weaver options="-Xlint:ignore -Xset:weaveJavaPackages=true -Xset:weaveJavaxPackages=true">
<include within="com.proj.*"/>
<include within="java.*"/>
<include within="javax.*"/>
<include within="org.springframework.*"/>
<include within="org.aspectj.*"/>
</weaver>
<aspects>
<aspect name="com.proj.SampleAspect"/>
</aspects>
</aspectj>
也尝试过 aop.xml
中的选项
options="-XnoInline -verbose -showWeaveInfo -debug -Xlint:ignore -Xset:weaveJavaPackages=true -Xset:weaveJavaxPackages=true"
看点
@Component
@Aspect
public class SampleAspect {
@Autowired
private RequestContextFilter interceptRequestContext;
@Around("@annotation(ExecuteByContext)")
public Object interceptByContext(final ProceedingJoinPoint pjp) throws Throwable {
if(SampleUtil.applyForRequest(interceptRequestContext.getRequestContext()) {
LOGGER.info(String.format("Intercept context for method %s", pjp.getSignature().getName()));
return null;
}
return pjp.proceed();
}
}
注释
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecuteByContext {
}
@Component
@Configurable
class TestClass implements ISomeInterface{
...
@ExecuteByContext
public void method() {
..
}
@ExecuteByContext
private void method1() {
..
}
}
Jetty 服务器以 [=42=] 设置启动
-javaagent:/path_to/.m2/repository/org/springframework/spring-instrument/4.2.0.RELEASE/spring-instrument-4.2.0.RELEASE.jar
我的 maven 中有以下依赖项
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
</dependency>
SampleAspect 没有被调用。我有几个方法(public,私有的和受保护的)用@ExecuteByContext 注释。
可能您的目标 类 不直接在包 com.proj
中,而是在子包中。包含子包的语法是 ..*
,而不是简单的 .*
,即在你的 aop.xml 你应该有
<include within="com.proj..*"/>
等等。
我终于通过以下修改解决了上面的问题
包括 -javaagent:/pathto/aspectjweaver-1.8.9.jar 当我启动码头服务器时确保编织发生。
但我确实有几个方面具有 @Autowired bean,我需要在方面中评估某些条件。这些方面返回 NullPointerException。原因是 spring 组件扫描发生并且 classes 已经加载并且加载时编织没有机会编织,因为 classes 已经加载。
为了在配置中解决这个问题 class 我添加了
@Bean
public SampleAspect sampleAspect() {
SampleAspect aspect = Aspects.aspectOf(SampleAspect.class);
return aspect;
}
添加此代码解决了 NPE。
并添加
-verbose -showWeaveInfo -debug
对 aop.xml 很有帮助
我还尝试了编织的 classes 的倾倒,看看是否编织了 class。此处有更多详细信息 -- https://eclipse.org/aspectj/doc/released/pdguide/printable.html#ltwdump
SpringAspectJ 加载时编织配置正在构建和加载服务器,没有任何错误,但是方面没有被调用。
这是配置列表 1) JDK 8 2) 服务器码头
@Configuration
@ComponentScan(basePackages = {..})
@EnableSpringConfigured
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
@PropertySource(...)
@ImportResource(value = { "classpath:META-INF/aop.xml", ..})
class config {
...
}
aop.xml
<aspectj>
<weaver options="-Xlint:ignore -Xset:weaveJavaPackages=true -Xset:weaveJavaxPackages=true">
<include within="com.proj.*"/>
<include within="java.*"/>
<include within="javax.*"/>
<include within="org.springframework.*"/>
<include within="org.aspectj.*"/>
</weaver>
<aspects>
<aspect name="com.proj.SampleAspect"/>
</aspects>
</aspectj>
也尝试过 aop.xml
中的选项options="-XnoInline -verbose -showWeaveInfo -debug -Xlint:ignore -Xset:weaveJavaPackages=true -Xset:weaveJavaxPackages=true"
看点
@Component
@Aspect
public class SampleAspect {
@Autowired
private RequestContextFilter interceptRequestContext;
@Around("@annotation(ExecuteByContext)")
public Object interceptByContext(final ProceedingJoinPoint pjp) throws Throwable {
if(SampleUtil.applyForRequest(interceptRequestContext.getRequestContext()) {
LOGGER.info(String.format("Intercept context for method %s", pjp.getSignature().getName()));
return null;
}
return pjp.proceed();
}
}
注释
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecuteByContext {
}
@Component
@Configurable
class TestClass implements ISomeInterface{
...
@ExecuteByContext
public void method() {
..
}
@ExecuteByContext
private void method1() {
..
}
}
Jetty 服务器以 [=42=] 设置启动
-javaagent:/path_to/.m2/repository/org/springframework/spring-instrument/4.2.0.RELEASE/spring-instrument-4.2.0.RELEASE.jar
我的 maven 中有以下依赖项
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
</dependency>
SampleAspect 没有被调用。我有几个方法(public,私有的和受保护的)用@ExecuteByContext 注释。
可能您的目标 类 不直接在包 com.proj
中,而是在子包中。包含子包的语法是 ..*
,而不是简单的 .*
,即在你的 aop.xml 你应该有
<include within="com.proj..*"/>
等等。
我终于通过以下修改解决了上面的问题
包括 -javaagent:/pathto/aspectjweaver-1.8.9.jar 当我启动码头服务器时确保编织发生。
但我确实有几个方面具有 @Autowired bean,我需要在方面中评估某些条件。这些方面返回 NullPointerException。原因是 spring 组件扫描发生并且 classes 已经加载并且加载时编织没有机会编织,因为 classes 已经加载。
为了在配置中解决这个问题 class 我添加了
@Bean
public SampleAspect sampleAspect() {
SampleAspect aspect = Aspects.aspectOf(SampleAspect.class);
return aspect;
}
添加此代码解决了 NPE。
并添加
-verbose -showWeaveInfo -debug
对 aop.xml 很有帮助
我还尝试了编织的 classes 的倾倒,看看是否编织了 class。此处有更多详细信息 -- https://eclipse.org/aspectj/doc/released/pdguide/printable.html#ltwdump