Java 根据提供的环境属性注入不同的bean
因此,我有一个可以为几个不同国家启动的应用程序,例如: mvn清洁包装-D国家=法国 分别。 mvn清洁包装-D国家=德国 对于不同的国家,我有不同的行为,特别是当我验证东西时 所以我有一个类,它包含一个依赖于国家的验证器:Java 根据提供的环境属性注入不同的bean,java,spring,dependency-injection,Java,Spring,Dependency Injection,因此,我有一个可以为几个不同国家启动的应用程序,例如: mvn清洁包装-D国家=法国 分别。 mvn清洁包装-D国家=德国 对于不同的国家,我有不同的行为,特别是当我验证东西时 所以我有一个类,它包含一个依赖于国家的验证器: @Component public class SomeValidatingClass { private final Validator myCountrySpecificValidator; @Autowired public SomeVal
@Component
public class SomeValidatingClass {
private final Validator myCountrySpecificValidator;
@Autowired
public SomeValidatingClass(MyCountrySpecificValidator myCountrySpecificValidator) {
this.myCountrySpecificValidator = myCountrySpecificValidator;
}
public void doValidate(Object target, Errors errors) {
myCountrySpecificValidator.validate(target, errors);
}
}
public class MyCountrySpecificValidator1 implements Validator {
@Override
public void validate(Object target, Errors errors) {
if (target == null) {
errors.rejectValue("field", "some error code");
}
}
}
第一个依赖于国家/地区的验证器:
@Component
public class SomeValidatingClass {
private final Validator myCountrySpecificValidator;
@Autowired
public SomeValidatingClass(MyCountrySpecificValidator myCountrySpecificValidator) {
this.myCountrySpecificValidator = myCountrySpecificValidator;
}
public void doValidate(Object target, Errors errors) {
myCountrySpecificValidator.validate(target, errors);
}
}
public class MyCountrySpecificValidator1 implements Validator {
@Override
public void validate(Object target, Errors errors) {
if (target == null) {
errors.rejectValue("field", "some error code");
}
}
}
第二个依赖于国家/地区的验证器:
让我们假设
public class MyCountrySpecificValidator2 implements Validator {
@Override
public void validate(Object target, Errors errors) {
if (target != null) {
errors.rejectValue("field", "some other error code");
}
}
}
我的问题是
- 当应用程序启动时,我如何将MyCountrySpecificValidator1的实例注入SomeValidatingClass
- 当应用程序启动时,我如何将MyCountrySpecificValidator2的实例注入SomeValidatingClass,“-Dcountry=GERMANY”
@Conditional
注释根据条件提供实现。像这样
@Bean(name="emailerService")
@Conditional(WindowsCondition.class)
public EmailService windowsEmailerService(){
return new WindowsEmailService();
}
@Bean(name="emailerService")
@Conditional(LinuxCondition.class)
public EmailService linuxEmailerService(){
return new LinuxEmailService();
}
在哪里
public class LinuxCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Linux"); }
}
你可以使用任何你需要的财产
或
如果需要多个bean,请使用@Profile
注释定义活动概要文件
阅读
更新:
更简单
@ConditionalOnProperty(name = "country", havingValue = "GERMANY", matchIfMissing = true) and annotate a method which return the germany validator. And the same for France.
非常感谢,还有一个问题。如何注入名为“emailerService”的bean?自动布线在这里不起作用,对吗?我必须使用beans.xml或类似的东西吗?编辑:可能使用@resource实际上您只需要一个
SomeValidatingClass
bean。您可以定义使用@Bean
和@Conditional(FranceCondition.class)
注释的方法,该方法返回MyCountrySpecificValidator1,并标记为@Conditional(GermanyCondition.class)
返回myCountrySpecificValidator2。用豆子就行了。(根据条件仅创建两个中的一个。