如何将属性注入Aspect日志类?

时间:2012-10-15 08:46:28

标签: java spring dependency-injection aspectj

我无法将属性注入LoggingAspect课程。成像我有一个AspectJ类:

@Aspect
public class LoggingAspect {
   private IBoc theBo;

   /** getter and setter **/
}

这是BOC:

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>

我如何在theBo课程中注入LoggingAspect


2012年10月17日更新

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

1 个答案:

答案 0 :(得分:2)

通常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;
    }
}