我在 Spring Boot Application 中拥有@Configuration
类。
它包含String
,Map<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>
我没有其他配置文件
答案 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) {
...
}