1

我在将属性注入LoggingAspect类时遇到问题。成像我有一个 AspectJ 类:

@Aspect
public class LoggingAspect {
   private IBoc theBo;

   /** getter and setter **/
}

这是中国银行:

public interface IBoc {
}

public class BocImpl implements IBoc {
}

和 BOC 的 Spring 配置:

<beans ...>
   <aop:aspectj-autoproxy/>

   <bean id="theBoc" class="org.huahsin.BocImpl"/>
</beans>

在 applicationContext.xml 文件中,我以这种方式配置 AspectJ:

<beans...>
   <bean id="theLog" class="org.huahsin.LoggingAspect">
      <property name="theBo" ref="theBoc"/>
   </bean>
</beans>

我怎么能theBoLoggingAspect课堂上注射?


2012 年 10 月 17 日更新

我在这里找到了一些线索。如果我删除,类<aop:aspectj-autoproxy>中的成员变量将不会为空。如果我有该代码,则 theBo 将为空。theBoLoggingAspect

4

1 回答 1

3

通常Spring负责创建和配置 bean。AspectJ然而,方面是由AspectJ运行时创建的。您需要Spring配置AspectJ已创建的方面。对于单例方面的最常见情况,例如LoggingAspect上面的方面,AspectJ定义了一个aspectOf()返回方面实例的方法。您可以告诉Spring将该aspectOf()方法用作获取方面实例的工厂方法。

例如:

  <beans>      
      <bean name="loggingAspect"
        class="org.huahsin.LoggingAspect"
        factory-method="aspectOf">
        <property name="theBo" ref="theBoc"/>
      </bean>

      <bean id="theBoc" class="org.huahsin.BocImpl"/>
  </beans>

更新:

在你的类中定义工厂方法:

@Aspect
public class LoggingAspect {

    private IBoc iBoc;

    private static LoggingAspect instance = new LoggingAspect();

    public static LoggingAspect aspectOf() {
        return instance;
    }

    public void setiBoc(IBoc iBoc) {
        this.iBoc = iBoc;
    }
}
于 2012-10-15T09:40:27.793 回答