суббота, 7 июля 2018 г.

Уточнение внедрения бинов

Бывают ситуации когда есть несколько реализаций бина одного и того же типа - тогда при внедрении надо будет уточнять какая именно реализация внедряется:
Spring:
в стеке Spring для этого есть аннотация @Qualifier("beanName"):
public class MyClass {
    @Inject
    @Qualifier("finebean1")
    private Fine fine1;

    @Inject
    @Qualifier("finebean2")
    private Fine fine2;
 ..........................................  
}
Соответственно в файле конфигурации есть 2 реализации бина одинакового типа:
@Configuration
public class AppCfg {

   @Bean("
finebean1")
   public Fine oneFine() {
       ................

   }
   @Bean("
finebean2")
   public
Fine twoFine() {
       .................

   }
}
JavaEE CDI:
Допустим продюсер (фабрика) реализует 2 бина одного типа:
public class MyProducer {
    @Produces 
    @SessionScoped
    @Named("finebean1") 
     public Fine getFine1() {
        return new Fine();
    }

    @Named("finebean1")   
    public void killFine1 (@Disposes Fine fine1) {
        fine1.close();
    }

    @Produces 
    @SessionScoped
    @Named("finebean2") 
     public Fine getFine2() {
        return new Fine();
    }

    @Named("finebean2")   
    public void killFine2 (@Disposes Fine fine2) {
        fine2.close();
    }

}
Здесь есть аналог @Qualifier - аннотация @Named, которую поддерживает и Spring и при внедрении уточнение бинов выглядит так:
public class MyClass {
    @Inject
    @Named("finebean1")
    private Fine fine1;

    @Inject
    @Named("finebean2")
    private Fine fine2;
 ..........................................  
}
также можно использовать и для аннотации @Resource:
public class AmbiguousResourceFine {
    @Resource
    @Named("fineDay")
    private Fine fine;
....................................
  }
@Named можно использовать как замену для @Component / @Service / @Controller / @Repository
Для аннотации @Resource имя можно задать как параметр:
public class MyResss {
    @Resource(name = "rrresss")
    private Resss resss;

}
Для поддержки аннотаций @Named и @Inject CDI стека JavaEE в проекте Spring надо добавить зависимость:
<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

Для поддержки всех аннотаций CDI в проект Spring можно добавить зависимость:
<dependency>
     <groupId>javax.enterprise</groupId>
     <artifactId>cdi-api</artifactId>
     <version>1.2</version>
</dependency>

тогда будут работать все аннотации из CDI, которые поддерживает Spring - @Named, @Inject, @PostConstruct, @PreDestroy, @Resource и др.

Комментариев нет:

Отправить комментарий

Взаимодействие между приложениями и Watch Service

Взаимодействие между разными приложениями Java можно сделать с помощью файловой системы, базы данных и JMS. Рассмотрим случай ФС - в Java ...