Spring依赖注入带注释的方面

Spring依赖注入带注释的方面,spring,dependency-injection,aop,aspectj,load-time-weaving,Spring,Dependency Injection,Aop,Aspectj,Load Time Weaving,在使用Spring时,我在对带注释的方面类进行依赖项注入时遇到了一些问题。CacheService在Spring上下文启动时被注入,但是当编织发生时,它表示CacheService为null。因此,我被迫手动重新连接spring上下文并从那里获取bean。 还有别的办法吗 以下是我的方面的一个例子: import org.apache.log4j.Logger; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lan

在使用Spring时,我在对带注释的方面类进行依赖项注入时遇到了一些问题。CacheService在Spring上下文启动时被注入,但是当编织发生时,它表示CacheService为null。因此,我被迫手动重新连接spring上下文并从那里获取bean。 还有别的办法吗

以下是我的方面的一个例子:

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import com.mzgubin.application.cache.CacheService;

@Aspect
public class CachingAdvice {

  private static Logger log = Logger.getLogger(CachingAdvice.class);

  private CacheService cacheService;

  @Around("execution(public *com.mzgubin.application.callMethod(..)) &&"
            + "args(params)")
    public Object addCachingToCreateXMLFromSite(ProceedingJoinPoint pjp, InterestingParams params) throws Throwable {
    log.debug("Weaving a method call to see if we should return something from the cache or create it from scratch by letting control flow move on");

    Object result = null;
    if (getCacheService().objectExists(params))}{
      result = getCacheService().getObject(params);
    } else {
      result = pjp.proceed(pjp.getArgs());
      getCacheService().storeObject(params, result);
    }
    return result;
  }

  public CacheService getCacheService(){
    return cacheService;
  }

  public void setCacheService(CacheService cacheService){
    this.cacheService = cacheService;
  }
}

据我所知,问题是Spring正在为您创建这种类型的bean,但是AspectJ框架也在创建这种类型的实例化,因为它不知道Spring已经这样做了

我相信您希望为Spring提供一个工厂方法,用于实例化bean,该bean还可以让AspectJ知道Aspect已创建:

<!-- An @Aspect-annotated class -->
<bean id="bar" class="com.foo.bar" factory-method="aspectOf">
    <property name="meaning" value="42" />
</bean>

我今天早些时候遇到了这个问题,后来找到了答案,所以我回来结束这个循环


我并不十分清楚这里发生了什么,但我确实看到有一个Aspects类提供了一些这种风格的静态构造函数。想必AspectJ正在将同名的静态方法编织到每个方面,以促进这种构造。

我也面临着这样的问题

这是如何修复的:

@Aspect
public class MyAspect {
  @Resource // telling spring that at first look up bean by name;
  Session session; // resource that won't of being setup;

  private static class MyAspectHolder {
    static final MyAspect instance = new MyAspect();
  }

  ...

  // special purpose method w/o it - stuff doesnt work;
  public static MyAspect aspectOf() {
    return MyAspectHolder.instance;
  }
}

当然,不要忘记配置中的
以及方面bean定义。

因为方面是在Spring容器之前创建的,所以必须从方面的工厂方法aspectOf(ExampleClass.class)检索方面

从Spring XML配置中,您可以检索如下方面(对象):

<bean id="traceAspect" class="aspects.trace.TraceAspect"
    factory-method="aspectOf" />


工厂方法是检索Spring容器外部创建的对象(如枚举)的正常方法。

因此,在我的aspect类中简单地设置aspectOf方法似乎可以解决这个问题。我不知道为什么这只是工作,因为我看到的大多数其他修复没有。顺便说一句,我们尝试通过spring aspect和其他一些工具@Configurable,但似乎没有一个工具能够将bean正确地连接到aspectj单例。如果您编写经典的aspectj aspect,aspectj编译器将生成aspecOf静态访问器: