Spring:两个bean实现一个接口,其中一个作为@Primary - autowiring创建两个bean

时间:2014-11-24 13:07:18

标签: java spring

一个界面:BeanMapperUtil

两个实施bean:

  1. OrikaBeanMapper - Singleton bean并标记为@Primary
  2. DirectBeanMapper - 原型bean
  3. 在Manager类中:

    @Autowired
    BeanMapperUtil mapper;
    

    观察:Spring会同时创建OrikaBeanMapperDirectBeanMapper,然后自动加载OrikaBeanMapper

    预期:由于OrikaBeanMapper已标记为@Primary,因此Spring应仅创建此bean并自动加载它。 Spring不需要创建DirectBeanMapper的实例。对性能/功能没有影响,但这看起来像浪费的实例创建只是被丢弃。

2 个答案:

答案 0 :(得分:0)

当你的应用程序启动时,Spring容器会创建所有bean的实例(期望原型bean),这些bean在那里注册并将该bean存储在BeanFactory中。

因此,所有bean都是一次创建的,只有BeanMapperUtil被注入,因为它用于自动装配。

答案 1 :(得分:0)

在创建所有匹配的bean之后,

@Primary用作过滤器。它的目的不是阻止查找和创建其他非主要匹配bean。

当Spring尝试自动装配BeanMapperUtil时,它会找到两个匹配项OrikaBeanMapperDirectBeanMapper,并且两者都将被创建。此时@Primary开始发挥作用。 Spring将选择带注释@Primary注释的bean。