Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么AspectJ在包作用域方法上编织不起作用?_Java_Spring_Aop_Aspectj_Spring Aop - Fatal编程技术网

Java 为什么AspectJ在包作用域方法上编织不起作用?

Java 为什么AspectJ在包作用域方法上编织不起作用?,java,spring,aop,aspectj,spring-aop,Java,Spring,Aop,Aspectj,Spring Aop,我试图在基于Spring的应用程序中打印私有和包作用域方法的日志(来自包作用域类)。由于Spring基于代理的方面不适用于私有和包范围的方法(?),因此我尝试按照文档使用AspectJ加载时编织。详情如下: 日志方面 @Component(Constants.LOGGING_ASPECT_BEAN) @Aspect public class LoggingAspect { @Around("@annotation(my.pkg.Loggable)") public Object doLo

我试图在基于Spring的应用程序中打印私有和包作用域方法的日志(来自包作用域类)。由于Spring基于代理的方面不适用于私有和包范围的方法(?),因此我尝试按照文档使用AspectJ加载时编织。详情如下:

日志方面

@Component(Constants.LOGGING_ASPECT_BEAN)
@Aspect
public class LoggingAspect {
  @Around("@annotation(my.pkg.Loggable)")
  public Object doLogging(final ProceedingJoinPoint joinPoint) throws Throwable {
    // ... logging code.
  }
}
弹簧配置

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Import(AnotherBaseConfig.class)
@ComponentScan("my.pkg")
@EnableWebMvc
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.AUTODETECT)
public class AppConfiguration extends WebMvcConfigurerAdapter {
  // ... bean configs
}
src/main/webapp/META-INF/aop.xml

<aspectj>
  <weaver>
    <include within="my.pkg.*">
  </weaver>
  <aspects>
    <aspect name="my.logger.LoggingAspect"/>
  </aspects>
</aspectj>
通过以上配置,我的包作用域类如下:

@Component("someClass")
class SomeClass {
  @Loggable
  void doSomething(@Loggable final String s, @Loggable final Integer i) {
    // ... do something here.
  }
}

编织不适用于此类包范围的类。我做错了什么吗?

您在这里混淆了两种AOP样式:

  • Spring AOP是一种基于代理的“AOP lite”方法,可通过
    @enableAspectProxy
    激活。它只适用于Spring组件的公共、非静态方法
  • AspectJ是一个成熟的AOP框架,它也适用于包本地或私有方法,无论它们是否是Spring组件,都是通过
    @EnableLoadTimeWeaving
    从Spring内部启用的,而编织代理通过
    -javaagent:“/path/to/aspectjweaver-1.8.1.jar”
    启用的。在这种情况下,方面也不需要是Spring组件。注意:我建议使用最新的AspectJ版本1.8.5,而不是1.8.1

由于要使用包局部变量,需要AspectJ LTW。请清楚地配置Spring,优先选择一种AOP类型。有关更多信息,请参阅。关于AspectJ LTW配置的具体信息在中。

spring团队的任何人可以在这里帮助我吗?
@Component("someClass")
class SomeClass {
  @Loggable
  void doSomething(@Loggable final String s, @Loggable final Integer i) {
    // ... do something here.
  }
}