Это решение работает без XML и с файлом свойств.
Ваши классы улучшены:
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
(здесь вы можете изменить, какой класс будет загружен):
service.class=serviceA
и важный файл конфигурации AppConfig.java
:
@Configuration
public class AppConfig {
@Autowired
private ApplicationContext context;
@Bean
public MyService MyServiceAlias(@Value("${service.class}") String qualifier) {
return (MyService) context.getBean(qualifier);
}
}
Дополнительные пояснения:
- Используйте
@Qualifier
только для поля, которое будет автоматически подключено.Для сервисов, чтобы указать имя компонента, используйте @Service
. - Если вы хотите стандартное имя компонента, вам не нужно использовать
@Service
с указанным именем.Например, стандартное имя компонента для ServiceA - serviceA
(не ServiceA
- см. Большую первую букву), поэтому @Service("serviceA")
избыточно (достаточно @Service
). - Я основал
AppConfig
на этомответ: Псевдоним bean-компонента Spring в JavaConfig . - Это решение лучше, чем квалификатор Spring и заполнитель свойства , поскольку вам не нужен XML.
- Проверено на Spring Boot 1.5.7.