春季:如何使用注释从同一类创建两个不同的bean?

时间:2020-05-02 15:54:13

标签: java spring

假设我们有以下课程:

public class Service {
    private String name;

    public Service(String name) {
        this.name = name;
    }

    /// other methods
}

假设我要从同一类生成两个不同的bean。如果我使用xml,则非常简单:

<beans>
   <bean id="service1" class="Service">
      <constructor-arg value="first service" />
   </bean>
   <bean id="service2" class="Service">
      <constructor-arg value="second service" />
   </bean>
</beans>

我的问题是如何使用spring注释生成它。

编辑: link中的答案不适合我的问题。在此链接中,类MySecondComponent生成了两次,但是它具有默认的构造函数,并且我们不会为每个实例传递不同的参数/依赖关系。

1 个答案:

答案 0 :(得分:0)

这是在Java中执行相同操作的一种方法(从spring 3.x开始):

@Configuration
public class MySampleConfiguration {

   @Bean
   public Service service1() {
      return new Service("first service");
   }

   @Bean
   public Service service2() {
      return new Service("second service");
   }
}

更新1

基于OP的评论:

有不同的用例,有些用例需要指定bean名称,而其他用例则不需要。

用例1:

说,有一个需要实例化的bean,例如service1

public class SampleBean {
    private final Service service;

    public SampleBean(Service service) {
       this.service = service;
    }
}

理想情况下,您不想在SampleBean类的代码中指定限定符,因为它在某种程度上破坏了依赖注入原理。但是,您可以在配置中做到这一点:

@Configuration
public class MySampleConfigurationWithQualifier {

    @Bean(name = "service1")
    public Service service1() {
       return new Service1("first service");
    }

    @Bean(name = "service2")
    public Service service2() {
       return new Service2("second service");
    }

    @Bean
    public SampleBean sampleBean(@Qualifier("service1") Service service) {
       return new SampleBean(service);
    }
}

用例2:

说,这些服务应该以某种集合(例如列表)的形式注入到另一个bean中。

在这种情况下,无需指定name属性

public class SampleBean2 {

   private final List<Service> services;

   public SampleBean2(List<Service> services) {
      this.services = services;
   }

   public void notifyOnSomeEvent(Event evt) {
      for(Service service : services) {
        service.notify(evt);
      }
   }
}

在这种情况下,配置可能如下所示:

@Configuration
public class MySampleConfigurationWithListInjection {

    @Bean(name = "service1")
    public Service service1() {
       return new Service1("first service");
    }

    @Bean(name = "service2")
    public Service service2() {
       return new Service2("second service");
    }

    @Bean
    public SampleBean2 sampleBean2(List<Service> services) {
       return new SampleBean2(services);
    }
}