2

我正在使用 maven、spring 和 aspectj 进行编译时编织

我的 aspectj 顾问看起来像这样

@Aspect
public class LoggingInterceptor {
  private LogManager logManager;
  public void setLogManager(LogManager logManager) {
    this.logManager = logManager;
  }
  .....
} 

我的 applicationContext.xml 看起来像这样

<!--configures the AspectJ aspect and indicates which Spring context should be used when giving advice-->
<context:spring-configured />

<aop:aspectj-autoproxy/>

<!--<context:component-scan base-package="com.reverb" />-->

<bean id="loggingInterceptor" class="com.myapp.interceptor.LoggingInterceptor">
    <property name="logManager" ref="logManager" />
</bean>

logManager 始终为空....

4

2 回答 2

9

我没有看到你logManager在任何地方被定义。即使是,@Aspects 也不会自动符合注入条件。事实上,你有 2 个对象——一个是 type 的 bean,LoggingInterceptor另一个是实际处理 AOP 的切面。但是方面不是一个bean。

为了完成这项工作,您需要factory-method="aspectOf"为您的<bean>. 请参阅此处了解更多信息。

于 2011-01-24T18:41:21.613 回答
1

使用 java 配置,它将如下所示:

@Configuration
@EnableSpringConfigured
public class AspectConfig {
}

不要忘记:

  • 添加@Configurable注释

方面:

@Aspect
@Configurable
public class CounterAspect { 
    @Inject
    private CounterService counter;
    //...
} 
  • 添加'org.springframework:spring-aspects'为编译依赖

  • 添加META-INF/aop.xml

内容:

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>   
    <!-- add to debug: options="-showWeaveInfo -verbose -debug"-->
    <weaver>
        <include within="com..*"/>
    </weaver>    
    <aspects>
        <aspect name="com.your.package.CounterAspect"/>
    </aspects>    
</aspectj>
  • 使用类似的东西启用 javaagent-javaagent:/path-to-aspectj/aspectjweaver-1.8.10.jar
于 2017-10-06T12:17:27.997 回答