Создайте прокси для интерфейса, который может вводиться с помощью @Autowired, прокси вызывает другой инструмент по ключевому параметру - PullRequest
0 голосов
/ 06 мая 2018

Я хочу определить аннотацию наподобие @PlatformRelated, как только она будет помечена в интерфейсе, в контексте Spring будет прокси-бин, и этот прокси-бин должен иметь значение @ Priority. Я хочу, чтобы этот прокси мог вызывать другую реализацию в соответствии с ключевой параметр @ KeyPrameter. И я все еще хочу использовать функции пружины, такие как @ Async, @ Trasaction и т. д., в моем Implement1 и Implement2.

@PlatformRelated
interface MyInterface {
   method(@KeyPrameter String parameter);
}

@Component
class Implement1 implements MyInterface {
   method(String parameter){
       //do something 111
   }
}

@Component
class Implement2 implements MyInterface {
   method(String parameter){
       //do something  222
   }
}

@Service
class BusinessService{
    @Autowired
    private MyInterface myInterface;

    public void doSomething() {
        myInterface.method("key1");
        //Implement1 work
        myInterface.method("key2");
        //Implement2 work
    }
}

У вас, ребята, есть хорошая идея, чтобы завершить ее?

1 Ответ

0 голосов
/ 06 мая 2018

Я должен признать, что не совсем понял значение @Priority, однако могу сказать, что если вы хотите реализовать эту функцию весной, вам, вероятно, стоит взглянуть на Bean Post Processors.

BeanPostProcessors - это, по сути, привязка к процессу создания бина весной, предназначенная для изменения поведения бина. Помимо прочего, они позволяют оборачивать базовый компонент в прокси-сервер (CGLIB / java.lang.Proxy, если вы работаете с интерфейсами или даже программно используете Spring AOP), эти прокси-серверы могут предоставить хук для выполнения метода, который может прочитать ваши аннотации (например, упомянутый @KeyParameter) и выполнение кода способом, аналогичным коду Aspect, который вы уже используете.

Не все постпроцессоры бинов переносят бин в прокси. Например, если вы хотите реализовать BPP, использующий "@Autowire", вы вернете тот же компонент, просто "внедрив" (прочитайте, поместите с помощью отражения) его зависимости. С другой стороны, если вы хотите реализовать с поведением BPP @Transactional, тогда да, вы должны заключить бин в прокси, который позаботится о возможностях управления транзакциями до и после выполнения метода.

Вполне нормально иметь бин пружины, который "изменяется" многими постпроцессорами, некоторые из них обернут его в прокси, другие просто изменят и вернут тот же бин, если есть много BPP, которые обернув компонент в прокси, мы получим «прокси внутри прокси внутри прокси» (вы поняли). Каждый слой прокси будет обрабатывать одно конкретное поведение.

В качестве примера, я предлагаю вам взглянуть на существующие постпроцессоры Spring или, например, на исходный код следующей библиотеки: Библиотека интеграции учета Spring Spring

Эта библиотека содержит некоторые реализации постпроцессоров, которые позволяют интегрировать инфраструктуру метрик путем определения аннотаций для методов Spring Beans.

...