Spring Boot配置。集合自动接线-成功自动接线后获得意外的价值

时间:2019-03-19 18:28:02

标签: java spring spring-boot

我在 Spring Boot Application 中拥有@Configuration类。

它包含StringMap<Integer, List<String>>List<String> bean类型。

@Bean
public String getSomeString() {
    return "String";
}

@Bean
public Map<Integer, List<String>> getMap() {
    return ...;
}

@Bean
public List<String> getList() {
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    return list;
}

@Bean
public CustomClass getInstance(Map<Integer, List<String>> map, String someString, List<String> list) {
    return new CustomClass(map, someString, list);
}

getList()返回包含"1","2"的列表。 但是在getInstance()中,我得到的列表仅包含一个元素-"String"。与getSomeString()的值相同。

当我将List<String> getList()更改为ArrayList<String> getList()(以及getInstance()的参数)时,它也起作用。

问题出在哪里?

p.s。
我没有其他方法返回List<String>
我没有其他配置文件

1 个答案:

答案 0 :(得分:1)

根据文档,这是spring定义的预期行为:

  

您还可以从   通过将注解添加到以下字段或方法来实现ApplicationContext   期望该类型的数组,如以下示例所示:

public class MovieRecommender {

    @Autowired
    private MovieCatalog[] movieCatalogs;

    // ...
}
     

这同样适用于类型化集合,如以下示例所示:

public class MovieRecommender {

    private Set<MovieCatalog> movieCatalogs;

    @Autowired
    public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
        this.movieCatalogs = movieCatalogs;
    }

    // ...
}

这意味着,当您将集合/数组与自动装配结合使用时,spring将检查它是否可以收集可分配给您的泛型类型的所有bean并为您创建集合/数组。在上面的示例中,它收集了所有MovieCatalog个bean,在您的情况下,它收集了所有String个bean。

例如,如果将列表参数修改为List<Object>,则将在ApplicationContext中接收所有对象。

解决方案

我建议您使用@Qualifier来解决它。

您可以使用@Qualifier来表示要注入到方法中的bean:

@Bean
  public Object getInstance(Map<Integer, List<String>> map, String someString, @Qualifier("getList")List<String> list) {
...
}

您还可以为bean定义一个名称,并在@Qualifier上使用它:

 @Bean(name = "list")
  public List<String> getList() {
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    return list;
  }

  @Bean
  public Object getInstance(Map<Integer, List<String>> map, String someString, @Qualifier("list")List<String> list) {
    ...
  }