Могу ли я использовать @Autowired
Spring 4.x @Component
s с @ConditionalOnProperty
для выбора реализаций Feature на основе файла featuretoggles.properties?
public class Controller {
@Autowired
private Feature feature;
}
@Component
@ConditionalOnProperty(name = "b", havingValue = "off")
public class A implements Feature {
}
@Component
@ConditionalOnProperty(name = "b", havingValue = "on")
public class B implements Feature {
}
@Configuration
@PropertySource("classpath:featuretoggles.properties")
public class SomeRandomConfig {
}
С файлом src / main / resources / featuretoggles.properties:
b = on
(То, что имя переключателя «b» и имя совпадения класса «B» является совпадением; моя цель не состояла в том, чтобы они были равны, переключатель мог иметь любое имя.)
Это не позволяет автоматически соединить feature
в Controller
с UnsatisfiedDependencyException
, говоря: «Нет подходящего bean-компонента типа 'Feature', доступного: ожидается, по крайней мере, 1 bean-компонент, который квалифицируется как кандидат autowire».
Я знаю, что могу реализовать это с помощью класса @Configuration
, который выбирает @Bean
в зависимости от свойства. Но когда я это делаю, мне приходится добавлять новый класс конфигурации каждый раз, когда я добавляю переключатель функции, и эти классы конфигурации будут очень похожи:
@Configuration
@PropertySource("classpath:featuretoggles.properties")
public class FeatureConfig {
@Bean
@ConditionalOnProperty(name = "b", havingValue = "on")
public Feature useB() {
return new B();
}
@Bean
@ConditionalOnProperty(name = "b", havingValue = "off")
public Feature useA() {
return new A();
}
}
@PropertySource
используется только для@Configuration
файла. Теперь он никогда не будет загружен, и ваши условия никогда не будут совпадать. Тем не менее, я бы все же выбрал класс конфигурации, так как он менее волшебный и на ваш взгляд, чем все эти аннотированные компоненты. - person M. Deinum   schedule 19.05.2017@Component
вообще не работает с@ConditionalOnProperty
, или у меня просто все еще есть ошибка, из-за которой не удается загрузить файл свойств. К сожалению, Spring на самом деле не дает для этого значимого вывода журнала. - person Florian   schedule 19.05.2017