Spring特性未应用于ServiceFactoryBean创建的bean
我在将方面应用于ServiceFactoryBean创建的(ServiceLoader加载的)bean时遇到问题 我的spring上下文如下所示: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
...
<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();
}
}