Как установить несколько целей в ProxyFactoryBean и вызвать один из целевых методов на основе Config? - PullRequest
1 голос
/ 06 марта 2020

В java Я хочу реализовать прокси-класс (Proxy Factory Bean), который будет принимать несколько целей (реализуя один и тот же интерфейс) и вызывать одно из значений конфигурации на основе целевого метода.

Собака и кошка, реализующая Animal и на основе некоторого значения конфигурации (Y или N) хотят вызвать одну из его реализаций. Это может быть сделано с использованием стратегии, но моя проблема в том, что аналогичные logi c необходимо применять для других реализаций, которые реализуют разные интерфейсы. (Пример ниже я добавил ниже классов Audi и Benz, реализующих автомобильный интерфейс) и хочу выбрать реализации на основе в конфигурации.

  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");
          }
        }

2-й компонент:

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");
    }
  }

пример конфигурации пружины

<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>

и в контроллере вводить один и тот же интерфейс (автомобиль, животное) и вызывать оригинальный метод без какой-либо прокси-инъекции.

Может кто-нибудь подсказать, как это можно сделать либо с SpringProxyFactoryBean, либо с пользовательской реализацией?

В основном в прокси-классе, я хочу проверить значение конфигурации и в зависимости от того, что я хочу вызвать метод для этого конкретного объекта реализации.

Если значение конфигурации равно Y, из списка определенных целей получить ссылку на компонент E в прокси и вызвать метод для него.

1 Ответ

0 голосов
/ 06 марта 2020

Прокси обычно используются, когда вы хотите перехватить запрос к вызову метода (предпочтительно интерфейсного метода) до вызова целевой реализации.

Spring позволяет это с помощью ProxyFactoryBean. Вы настраиваете его для прокси одного или нескольких интерфейсов (разных видов) и целевой реализации и одного или нескольких перехватчиков. Когда вы запрашиваете реализацию любого из этих интерфейсов, сконфигурированные перехватчики получают возможность прослушивать, но в конечном итоге вызывается вызываемый метод в целевом классе.

Не слишком уверен, какова ваша конечная цель, но все, что вы пытаетесь сделать, это создать косвенное направление и на основе какого-либо условия вызвать реализацию класса A или реализацию класса B. ProxyFactoryBean не решает эту проблему напрямую.

Один из вариантов - создать несколько управляемых bean-компонентов Spring для ProxyFactoryBean, по одной для каждой реализации, и получить бин из фабрики по имени. Их имена идентификаторов, очевидно, будут другими.

Второй вариант - создать третий класс, реализующий интерфейс, назначить этот класс в качестве цели в конфигурации 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. Зарегистрируйте обе реализации интерфейса под разными именами и запросите их в зависимости от условия от BeanFactory.

...