有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring ProxyFactoryBean服务拦截不唯一

在ProxyFactoryBean和MethodInterceptor的帮助下截取多个服务接口时,当服务接口方法名称相同时,拦截器出于某种原因将服务接口混合在一起。我的问题是:

1。)在使用单个ProxyFactoryBean截取多个接口时,是否需要遵守规则

2。)代码哪里出错?我尝试在“proxyInterfaces”列表中切换另一个服务和一个服务的顺序,但这也不起作用

3。)我通过将ProxyFactoryBean一分为二解决了这个问题(请参阅底部的“解决方法”)。这是唯一的解决方案,还是有一种方法可以让ProxyFactoryBean保持“代码”部分所述的状态

代码:

我用一个ProxyFactoryBean截取了几个服务:

<bean name="MyInterceptor" class="com.test.MyInterceptor">

<bean class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="interceptorNames">
    <list>  
      <value>MyInterceptor</value>
    </list>
  </property>
  <property name="proxyInterfaces">
    <list>
     <value>com.test.AService</value>
     <value>com.test.AnotherService</value>
    </list>
  </property>
</bean>

使用拦截器类MyInterceptor实现“调用”,如下所示:

public Object invoke(MethodInvocation invocation) throws Throwable {
  Method method = invocation.getMethod();
  String interfaceName = method.getDeclaringClass().getName();
  System.out.println(interfaceName + ": " + method.getName());
}

服务接口声明如下:

public interface AService{
    public void delete();

    public void test();
}

public interface AnotherService{
    public void delete();
}

现在,当我将AService自动关联到一个类中时,我希望可以使用AService的delete-and-test函数:

public class Test{

  @Autowired
  private AService aService;

  public void testAservice(){
    aService.test();
    aService.delete();
  }

}

在我的拦截器中,“A服务”。test()'调用到达时没有问题。然而,“A服务”。delete()'调用以某种方式触发另一个服务接口。拦截器的控制台输出如下:

com.test.AService: test
com.test.AnotherService: delete 

解决方法: 我将ProxyFactoryBean一分为二,使用两个独立的拦截器bean(尽管两者都与以前一样引用同一个类):

<bean name="MyInterceptor1" class="com.test.MyInterceptor"/>
<bean class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="interceptorNames">
    <list>  
      <value>MyInterceptor1</value>
    </list>
  </property>
  <property name="proxyInterfaces">
    <list>
     <value>com.test.AService</value>
    </list>
  </property>
</bean>

<bean name="MyInterceptor2" class="com.test.MyInterceptor"/>
<bean class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="interceptorNames">
    <list>  
      <value>MyInterceptor2</value>
    </list>
  </property>
  <property name="proxyInterfaces">
    <list>
     <value>com.test.AnotherService</value>
    </list>
  </property>
</bean>

现在,此配置将生成预期的输出:

com.test.AService: test
com.test.AService: delete

共 (1) 个答案

  1. # 1 楼答案

    代理只是列出的接口的一个实现,但在Java中,不可能从多个接口实现相同的方法而不发生冲突

    例如,请参见this线程

    因此,只需继续使用您的解决方法,或者将delete方法名称更改为不同的名称(imho更好的选项)