Бывают ситуации когда есть несколько реализаций бина одного и того же типа - тогда при внедрении надо будет уточнять какая именно реализация внедряется:
также можно использовать и для аннотации @Resource:
public class AmbiguousResourceFine {
@Resource
@Named("fineDay")
private Fine fine;
....................................
}
Spring:
в стеке Spring для этого есть аннотация @Qualifier("beanName"):
public class MyClass {
@Inject
@Qualifier("finebean1")
private Fine fine1;
@Inject
@Qualifier("finebean2")
private Fine fine2;
..........................................
}
public class AppCfg {
@Bean("finebean1")
public Fine oneFine() {
................
}
@Bean("finebean2")
public Fine twoFine() {
.................
}
}
Соответственно в файле конфигурации есть 2 реализации бина одинакового типа:
@Configurationpublic 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 и др.
<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 и др.
Комментариев нет:
Отправить комментарий