Java 如何将yml对象绑定到声明为对象实现的接口的字段?

Java 如何将yml对象绑定到声明为对象实现的接口的字段?,java,spring,spring-boot,yaml,Java,Spring,Spring Boot,Yaml,我有以下java层次结构: interface Foo { // methods } @Data @Component @NoArgsConstructor class Bar implements Foo { // override interface methods } @Data @Component @NoArgsConstructor class Baz implements Foo { // override interface methods } @D

我有以下java层次结构:

interface Foo {
    // methods
}

@Data
@Component
@NoArgsConstructor
class Bar implements Foo {
    // override interface methods
}

@Data
@Component
@NoArgsConstructor
class Baz implements Foo {
    // override interface methods
}

@Data
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "foo")
class FooConfig {
    List<Foo> stuff = new Arraylist<>;
}
但这是行不通的。我得到这个例外

未能实例化[Foo]:指定的类是接口


当我将
List stuff
更改为
List stuff
时,它只适用于
stuff[0]:{Bar}
您不需要任何配置属性/yml文件来实现这一点。Spring足够智能,可以检测接口的实现

就这么做吧

@Data
@Configuration
class FooConfig {
    @Autowired
    List<Foo> stuff;
}

在这种情况下,spring将创建一个映射,其中key作为bean名称(默认为bar和baz)

您需要使用
@Autowired
。更新了我的回答OK,这种方法有效,但spring团队不推荐现场注入。此外,它会将所有的Foo实现都拉入列表,因此它不是真正可配置的,也就是说,我不能排除某些实现。假设我只想在一个应用程序实例上运行Bar,在另一个应用程序实例上运行Baz,但这种方法总是会将两者都放入列表中。您仍然可以使用构造函数注入配置,但实际上配置与spring生态系统紧密耦合,任何这样做的参数都会下降。至于在不同的实例上运行一个,请使用概要文件或其他一些bean的条件初始化。这只是一个片段。您可以在几秒钟内将其更改为构造函数注入。这没什么大不了的。至于条件注入,Springboot提供了许多不同的方法,签出
@Profile
@Condition
条件下的下一个表达式
。。。。。。另一点是在yml文件中指定bean名称不是一个好主意。如果有人碰巧更改了类名,而忘记了在yml文件中进行更改,那么整个功能就不起作用了。另一点是,您应该在属性/yml文件中添加一些可配置的内容,而不是与类名紧密结合的内容
@Data
@Configuration
class FooConfig {
    @Autowired
    List<Foo> stuff;
}
@Data
@Configuration
class FooConfig {
   @Autowired
   Map<String, Foo> stuffMap;
}