Spring - 从集合或地图创建 bean
Spring - creating bean from collection or map
前段时间我在 Spring 中读到有关创建 bean 的内容,在为集合和映射创建 bean 时有一个例外。
我的意思是为集合或映射创建一个 bean,需要创建一个包装器 class,例如一个列表作为此 class
的字段
public class CollectionBean {
private List<String> someList;
}
然后就可以用于依赖注入了。
我想知道为什么它不能在没有包装器的情况下注入 class?
您绝对可以创建作为集合的 bean:
public class CollectionsBean {
@Autowired
private List<String> nameList;
public void printNameList() {
System.out.println(nameList);
}
}
@Configuration
public class CollectionConfig {
@Bean
public CollectionsBean getCollectionsBean() {
return new CollectionsBean();
}
@Bean
public List<String> nameList() {
return Arrays.asList("John", "Adam", "Harry");
}
}
可能造成混淆的是 Java 在编译时删除了类型的泛型部分。所以 Spring 无法在运行时查看对象并知道它是 List<String>
还是 List<Integer>
-- 对于 Java 和 Spring,在运行时,这只是一个 List
.
这意味着当存在多个 List
.
类型的 bean 时,type-based 自动装配将不起作用
解决这个问题的一种方法是像您所做的那样创建一个包装器 class。另一种方法是使用许多其他消除自动装配歧义的方法之一——例如通过名称。
前段时间我在 Spring 中读到有关创建 bean 的内容,在为集合和映射创建 bean 时有一个例外。 我的意思是为集合或映射创建一个 bean,需要创建一个包装器 class,例如一个列表作为此 class
的字段public class CollectionBean {
private List<String> someList;
}
然后就可以用于依赖注入了。 我想知道为什么它不能在没有包装器的情况下注入 class?
您绝对可以创建作为集合的 bean:
public class CollectionsBean {
@Autowired
private List<String> nameList;
public void printNameList() {
System.out.println(nameList);
}
}
@Configuration
public class CollectionConfig {
@Bean
public CollectionsBean getCollectionsBean() {
return new CollectionsBean();
}
@Bean
public List<String> nameList() {
return Arrays.asList("John", "Adam", "Harry");
}
}
可能造成混淆的是 Java 在编译时删除了类型的泛型部分。所以 Spring 无法在运行时查看对象并知道它是 List<String>
还是 List<Integer>
-- 对于 Java 和 Spring,在运行时,这只是一个 List
.
这意味着当存在多个 List
.
解决这个问题的一种方法是像您所做的那样创建一个包装器 class。另一种方法是使用许多其他消除自动装配歧义的方法之一——例如通过名称。