java - 如何为ProxyFactoryBean设置多个目标并根据Config调用其中一个目标方法?

标签 java spring spring-boot spring-mvc java-8

在java中,我想实现代理类(代理工厂Bean),它将采用多个目标(实现相同的接口(interface))并调用基于配置值的目标方法之一。

Dog 和 Cat 实现 Animal 并基于某些配置值(Y 或 N)想要调用其实现之一。这可以使用策略来完成,但我的问题是,类似的逻辑需要应用于实现不同接口(interface)的其他实现。(下面的示例,我在下面添加了实现汽车接口(interface)的奥迪和奔驰类)并希望根据配置选择实现。

  public interface Animal
        {

          public void sound();

        }

        public class Dog implements Animal
        {

          public void sound()
          {

            System.out.print("bark");
          }
        }

        public class Cat implements Animal
        {

          public void sound()
          {

            System.out.print("Meow");
          }
        }

第二个 bean :

public interface Car
  {

    public void make();

  }

  public class Audi implements Car
  {

    public void make()
    {

      System.out.print("Audi");
    }
  }

  public class Benz implements Car
  {

    public void make()
    {

      System.out.print("Mercedes");
    }
  }

Spring 配置示例

<bean id "animalService" class="proxyFactoryBean">
<list>
<target id"Y". "class"="com.Dog">
<target id"N". "class"="com.Cat">
<list>
</bean>

<bean id "carService" class="proxyFactoryBean">
<list>
<target id"Y". "class"="com.Audi">
<target id"N". "class"="com.Benz">
<list>
</bean>

并在 Controller 中注入(inject)相同的接口(interface)(汽车,动物)并调用原始方法,而无需任何代理注入(inject)。

有人可以建议如何使用 SpringProxyFactoryBean 或自定义实现来完成它吗?

基本上在代理类中,我想检查配置值,并根据配置值调用该特定实现对象上的方法。

如果配置值为 Y ,则从定义的目标列表中获取代理中的 Y bean 引用并调用其方法。

最佳答案

当您想要在调用目标实现之前拦截对方法调用(最好是接口(interface)方法)的请求时,通常会使用代理。

Spring 在 ProxyFactoryBean 的帮助下允许这样做。您将其配置为代理一个或多个接口(interface)(不同种类)以及目标实现和一个或多个拦截器。当您请求实现这些接口(interface)中的任何一个时,配置的拦截器有机会进行嗅探,但最终会调用目标类上的调用方法。

不太确定您的最终目标是什么,但您要做的就是创建一个间接寻址,并根据某些条件调用 A 类实现或 B 类实现。 ProxyFactoryBean 并没有直接解决这个问题。

其中一个选项是为 ProxyFactoryBean 创建多个 Spring 托管 bean,每个实现一个,并按名称从工厂获取 bean。他们的 ID 名称显然会不同。

第二个选项是让您创建实现该接口(interface)的第三个类,将该类指定为 Spring 配置中的目标,并根据您的条件调用 A 类实现或 B 类实现。看一下示例代码片段。

class CarDecider implements Car{
/*  
either get Audi impl from BeanFactory or ApplicationContext 
if they are configured beans
or create a new instance in case you don't have access to 
BeanFactory and serving through singleton instance is not a 
requirement
*/
    public void make(){
      if(<your condition for Audi true>){  
        beanFactory.getBean(Audi.class).make(); 
        // OR
        new Audi().make();
      }else{
        beanFactory.getBean(Benz.class).make(); 
        // OR
        new Benz().make();
      }
    }
}

第三种选择是完全避免使用 ProxyFactoryBean。使用不同的名称注册接口(interface)的两个实现,并根据 BeanFactory 的条件请求它们。

关于java - 如何为ProxyFactoryBean设置多个目标并根据Config调用其中一个目标方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60556263/

相关文章:

java - 如何在java中模拟Session对象

java - 如何在 Java 中创建一个通用的占位符函数,将函数作为参数供以后使用?

java - spring integration tcp-out-bound异常

java - 使用配置类时将@PreAuthorize 或@Secured 与 Jersey 一起使用

java - 没有 persistence.xml 的多个entityManagerFactory

spring-boot - Spring Boot 单元测试端点 NullPointerException - 以及如何达到 100% 的覆盖率

java - 如何通过@annotations 和 AST 转换让 IDE 知道类的添加?

java - 无法在 JDK13 上运行 dacapo 基准测试

java - Spring JPA Data Repository 通用实现示例

java - 如何使用 Spring Boot 2.1.1 从外部文件夹获取 "display"文件