Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring特性未应用于ServiceFactoryBean创建的bean_Spring_Aop_Serviceloader - Fatal编程技术网

Spring特性未应用于ServiceFactoryBean创建的bean

Spring特性未应用于ServiceFactoryBean创建的bean,spring,aop,serviceloader,Spring,Aop,Serviceloader,我在将方面应用于ServiceFactoryBean创建的(ServiceLoader加载的)bean时遇到问题 我的spring上下文如下所示: ... <aop:aspectj-autoproxy/> <bean id="myBean" class="org.springframework.beans.factory.serviceloader.ServiceFactoryBean" p:serviceType="com.test.MyInterf

我在将方面应用于ServiceFactoryBean创建的(ServiceLoader加载的)bean时遇到问题

我的spring上下文如下所示:

...
<aop:aspectj-autoproxy/>

<bean id="myBean"
      class="org.springframework.beans.factory.serviceloader.ServiceFactoryBean"
      p:serviceType="com.test.MyInterface"/>

<bean id="myAnotherBean"
      class="com.test.MyAnotherBean"/>
。。。
我的方面定义如下:

@Aspect
public class MyAspect {

    @Pointcut("bean(myBean)")
    public void foo() {
    }

    @Pointcut("bean(myAnotherBean)")
    public void bar() {
    }

    @Around("foo()")
    public Object doFoo(final ProceedingJoinPoint jp) throws Throwable {
        return timed(jp, "foo");
    }

    @Around("bar()")
    public Object doBar(final ProceedingJoinPoint jp) throws Throwable {
        return timed(jp, "bar");
    }

    private ThreadLocal<StopWatch> stopWatch = new ThreadLocal<StopWatch>();

    private Object timed(final ProceedingJoinPoint jp, final String taskName) throws Throwable {
        stopWatch.get().add(taskName);
        try {
            return jp.proceed();
        } finally {
            if (stopWatch.get() != null) {
                stopWatch.get().stop(taskName);
            }
        }
    }
}
@方面
公共类MyAspect{
@切入点(“bean(myBean)”)
公共图书馆{
}
@切入点(“bean(myAnotherBean)”)
公共空白栏(){
}
@围绕(“foo()”)
公共对象doFoo(final ProceedingJoinPoint jp)抛出可丢弃的{
返回时间(jp,“foo”);
}
@环绕(“bar()”)
公共对象doBar(最终处理连接点jp)抛出可丢弃{
返回时间(jp,“bar”);
}
私有ThreadLocal秒表=新ThreadLocal();
private Object timed(final ProcedingJoinPoint jp,final String taskName)抛出Throwable{
stopWatch.get().add(taskName);
试一试{
返回jp.procedure();
}最后{
if(stopWatch.get()!=null){
stopWatch.get().stop(taskName);
}
}
}
}
由于一些未知的原因,方面只应用于myAnotherBean的调用,而不应用于myBean的调用。
有什么想法吗?

正如smp7d在对您的问题的评论中所建议的,Spring创建的代理只有在方法调用来自另一个对象时才能应用建议。自我调用不足以触发建议


这里要理解的关键是,main类的main(..)中的客户机代码有一个对代理的引用。这意味着对该对象引用的方法调用将是对代理的调用,因此代理将能够委托给与该特定方法调用相关的所有拦截器(通知)。但是,一旦调用最终到达目标对象,即本例中的SimplePojo引用,它可能对自身进行的任何方法调用,例如this.bar()或this.foo(),都将针对this引用而不是代理进行调用。这具有重要意义。这意味着自调用不会导致与方法调用关联的通知有机会执行。

对未被通知的myBean的调用是自调用吗?
public class Main {

   public static void main(String[] args) {

      ProxyFactory factory = new ProxyFactory(new SimplePojo());
      factory.addInterface(Pojo.class);
      factory.addAdvice(new RetryAdvice());

      Pojo pojo = (Pojo) factory.getProxy();

      // this is a method call on the proxy!
      pojo.foo();
   }
}