java - Spring - 从集合或映射创建 bean

标签 java spring spring-bean

前一段时间,我读到有关在 Spring 中创建 bean 的内容,并且为集合和映射创建 bean 时有一个异常(exception)。 我的意思是为集合或映射创建一个 bean,需要创建一个包装类,例如将列表作为此类的字段

public class CollectionBean {

  private List<String> someList;

}

然后就可以在依赖注入(inject)中使用了。 我想知道为什么没有包装类就不能注入(inject)?

最佳答案

你绝对可以创建作为集合的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 时,基于类型的 Autowiring 将不起作用。 .

解决这个问题的一种方法是创建一个包装类,就像您所做的那样。另一种方法是使用许多其他方法来消除 Autowiring 的歧义——例如通过名称。

关于java - Spring - 从集合或映射创建 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56651179/

相关文章:

java - 将响应处理程序与 VertX 中的请求进行匹配

java - 如何知道 MVC View 中哪个字段要更新?

java - 用 java.math.BigDecimal 区分零和负零

Java Spring MVC 文件夹/命名约定

spring - Grails:SpringSecurity角色层次结构未按预期工作

java - 直接注入(inject)到 servlet 而不是新的 ClassPathXmlApplicationContext

JavaFX : how to handle dragging an item from a TreeView

Spring MVC : HTTP session management "equivalent"

java - BeanDefinitionRegistryPostProcessor - 如何将 @Configuration 类注册为 BeanDefinition 并同时注册它的 @Beans