【问题标题】:How to inject property into Aspect logging class?如何将属性注入 Aspect 日志记录类?
【发布时间】:2012-10-17 09:43:22
【问题描述】:

我无法将属性注入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>

如何在LoggingAspect 类中注入theBo


2012 年 10 月 17 日更新

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

【问题讨论】:

  • 到底是什么问题?据我了解,它应该可以正常工作。
  • 尝试用@Resource注解来注解theBo,如果有效,请告诉我们。

标签: java spring dependency-injection aspectj


【解决方案1】:

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

【讨论】:

  • 我收到此错误 -> javax.servlet.ServletException:创建 ServletContext 资源 [/WEB-INF/auditlog-spring-context.xml] 中定义的名称为“loggingAspect”的 bean 时出错:没有匹配的工厂找到方法:工厂方法'aspectOf'
  • 尝试将以下行添加到您的 spring 配置中:。另外不要忘记添加:
  • 你对这个错误有什么捷径吗? -> 原因:java.lang.IllegalStateException:ClassLoader [com.ibm.ws.classloading.internal.UnifiedClassLoader] 不提供“addTransformer(ClassFileTransformer)”方法。指定自定义 LoadTimeWeaver 或使用 Spring 的代理启动 Java 虚拟机:-javaagent:spring-agent.jar
  • 好的。删除那个加载时间编织器,向你的方面添加注释@Configurable,在你的spring xml中添加 并删除 factory-method="aspectOf"。如果这可行,我将编辑答案。对于上面的错误你可以看这里:dotkam.com/2010/10/12/running-spring-aspectj-tests-with-maven
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2010-12-16
  • 2022-07-06
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多