假设我们有以下课程:
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生成了两次,但是它具有默认的构造函数,并且我们不会为每个实例传递不同的参数/依赖关系。
答案 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);
}
}