Ответ
Да, Spring предоставляет несколько механизмов для условного выбора бина.
Основные подходы:
-
@Profile— активация бина в зависимости от активного профиля.@Profile("dev") @Service public class DevService implements MyService { /* ... */ } @Profile("prod") @Service public class ProdService implements MyService { /* ... */ } -
@Conditionalи его производные (Spring Boot) — гибкие условия на основе свойств, наличия классов и т.д.@Service @ConditionalOnProperty(name = "service.mode", havingValue = "advanced") public class AdvancedService implements MyService { /* ... */ } -
@Qualifier— явное указание имени конкретного бина при внедрении.@Autowired @Qualifier("devService") private MyService service; -
@Primary— помечает бин как предпочтительный при наличии нескольких кандидатов одного типа. -
Программный выбор через
@Beanметод — логика выбора реализуется в методе конфигурации.@Configuration public class AppConfig { @Bean public MyService myService(@Value("${mode}") String mode) { return mode.equals("dev") ? new DevService() : new ProdService(); } }