Spring Qualifier e segnaposto di proprietà

Qualcuno sa se dovrei essere in grado di usare il segnaposto di proprietà come espressione in un Qualificatore? Non riesco a farlo funzionare.

Sto usando la molla 3.0.4.

@Controller public class MyController { @Autowired @Qualifier("${service.class}") Service service; } @Service @Qualifier("ServiceA") ServiceA implements Service { public void print() { System.out.println("printing ServiceA.print()"); } } @Service @Qualifier("ServiceB") ServiceB implements Service { public void print() { System.out.println("printing ServiceB.print()"); } } 

XML:

    

config.properties:

 config.properties service.class=serviceB 

Questo funziona. È ansible distriggersre i nomi dei servizi se si utilizza solo il nome del bean di default. servizioA vs ServizioA, ecc.

 @Controller class MyController { @Autowired(required=false) @Qualifier("Service") Service service; public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("app-ctx.xml", MyController.class); for(String s:context.getBeanDefinitionNames()){ System.out.println(s); for(String t:context.getAliases(s)){ System.out.println("\t" + t); } } context.getBean(MyController.class).service.print(); } } public interface Service { void print(); } @Service(value="ServiceA") public class ServiceA implements example.Service { public void print() { System.out.println("printing ServiceA.print()"); } } @Service(value="ServiceB") public class ServiceB implements example.Service { public void print() { System.out.println("printing ServiceB.print()"); } } 

XML:

      

oggetti di scena:

 service.class=ServiceB 

Mi azzarderei a indovinare che la risposta è no, basandomi solo sulle annotazioni in poche pagine javadoc. Ad esempio, consulta i documenti per @Value :

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/beans/factory/annotation/Value.html

Si noti che fanno menzione speciale dell’utilizzo di espressioni nell’annotazione. Per confronto, i documenti per @Qualifier :

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/beans/factory/annotation/Qualifier.html

Che non menzionano le espressioni. Ovviamente non una risposta definitiva (ma la spring è generalmente molto buona sulla documentazione). Inoltre, se le espressioni fossero supportate nell’annotazione @Qualifier mi sarei aspettato che funzionassero allo stesso modo dell’annotazione @Value (basandosi solo sul fatto che Spring è un framework molto coerente).

Spring 3.1 ha la nuova funzione di bean di profilo, che sembra che possa realizzare qualcosa di simile a quello che stai cercando di fare. Ecco una recensione per questo:

http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/

Questa soluzione funziona senza XML e con file di proprietà.

Le tue lezioni sono migliorate:

MyController.java :

 @Controller public class MyController { @Autowired public MyController(@Qualifier("MyServiceAlias") MyService myService) { myService.print(); } } 

ServiceA.java :

 @Service("serviceA") public class ServiceA implements MyService { @Override public void print() { System.out.println("printing ServiceA.print()"); } } 

ServiceB.java :

 @Service("serviceB") public class ServiceB implements MyService { @Override public void print() { System.out.println("printing ServiceB.print()"); } } 

application.properties (qui puoi cambiare la class che verrà caricata):

 service.class=serviceA 

E il file di configurazione importante AppConfig.java :

 @Configuration public class AppConfig { @Autowired private ApplicationContext context; @Bean public MyService MyServiceAlias(@Value("${service.class}") String qualifier) { return (MyService) context.getBean(qualifier); } } 

Spiegazioni aggiuntive:

  • Utilizzare @Qualifier solo per il campo che verrà eseguito automaticamente. Per i servizi, per specificare il nome del bean, utilizzare @Service .
  • Se si desidera un nome bean standard non è necessario utilizzare @Service con nome specyify. Ad esempio, il nome del bean standard per ServiceA è serviceA (non ServiceA – vedi big first letter), quindi @Service("serviceA") ridondante ( @Service è sufficiente).
  • Ho basato AppConfig su questa risposta: Spring Bean Alias ​​in JavaConfig .
  • Questa soluzione è migliore di questo Spring Qualifier e segnaposto di proprietà , perché non hai bisogno di XML.
  • Testato su Spring Boot 1.5.7.

Forse dargli un vortice:

 @Controller public class MyController { private String serviceId; @Value("${serviceId}") public void setServiceId(String serviceId) { this.serviceId = serviceId; } @Autowired @Qualifier(serviceId) Service service; }