[英]How to define which bean to autowire in Spring
我有 2 个相同类型的豆子:
@Component("beanA")
public class BeanA implements BaseBean {}
@Component("beanB")
public class BeanB implements BaseBean {}
这种类型在我的服务中使用:
@Service
public class MyService {
@Autowired
private BaseBean baseBean;
}
现在我想在另一个服务中使用两个可能的 MyService bean
@Service
public class AnotherService {
@Autowired
private MyService myServiceWithBeanA;
@Autowired
private MyService myServiceWithBeanB;
}
我怎样才能做到这一点? 也许我应该采取另一种方法?
我知道如何在基于 XML 的 bean 配置中做到这一点。 如何使用注释来做到这一点?
<bean id="AnotherService" class="AnotherService">
<property name="myServiceWithBeanA" ref="myServiceWithBeanA" />
<property name="myServiceWithBeanB" ref="myServiceWithBeanB" />
</bean>
<bean id="myServiceWithBeanA" class="MyService">
<property name="baseBean" ref="beanA" />
</bean>
<bean id="myServiceWithBeanB" class="MyService">
<property name="baseBean" ref="beanB" />
</bean>
<bean id="beanA" class="BeanA" />
<bean id="beanB" class="BeanB" />
问题是MyService
用@Service
注释。 这意味着它是 singleton - 只会创建一个实例。
为了创建多个实例,您需要通过配置暴露两个@Bean
。
@Configuration
public class MyServiceConfig {
@Bean
public MyService serviceA(@Qualifier("beanA") beanA) {
return new MyService(beanA);
}
@Bean
public MyService serviceB(@Qualifier("beanB") beanB) {
return new MyService(beanB);
}
}
MyService
将成为
public class MyService {
private BaseBean baseBean;
public MyService(BaseBean baseBean) {
this.baseBean = baseBean;
}
}
然后,您可以使用限定符将所有这些传递给其他服务
@Service
public class AnotherService {
@Autowired
@Qualifier("serviceA")
private MyService myServiceWithBeanA;
@Autowired
@Qualifier("serviceB")
private MyService myServiceWithBeanB;
}
使用@Qualifier
注释,您可以指定要自动装配的 bean。
@Service
public class AnotherService {
@Autowired
@Qualifier("beanA")
private MyService myServiceWithBeanA;
@Autowired
@Qualifier("beanB")
private MyService myServiceWithBeanB;
}
希望这可以帮助。
在您的xml
bean 定义中添加这些标签<qualifier value="name"/>
。
<bean id="myServiceWithBeanA" class="MyService">
<qualifier value="A"/>
<property name="baseBean" ref="beanA" />
</bean>
<bean id="myServiceWithBeanB" class="MyService">
<qualifier value="B"/>
<property name="baseBean" ref="beanB" />
</bean>
然后你可以通过使用Qualifier
注释来获取它们,如下所示:
@Autowired
@Qualifier("A")
private MyService myServiceWithBeanA;
@Autowired
@Qualifier("B")
private MyService myServiceWithBeanB;
你也可以做更多的事情。 查看以下链接上的文档: Qualifier documentaiton
并非所有事情都可以通过注释来完成。 如果您需要创建一个 bean 的多个实例但具有不同的 arguments,您必须回退到@Configuration并像在 XML 配置中那样定义这些 bean。
@Configuration
public class AppConfig {
@Bean
public MyService myServiceWithBeanA(BeanA beanA) {
return new MyService(beanA);
}
@Bean
public MyService myserviceWithBeanB(BeanB beanB) {
return new MyService(beanB);
}
}
现在只需告诉AnotherService
期望MyService
两次匹配 bean 名称,因为 bean 定义方法的名称是它的默认限定符。
@Service
public class AnotherService {
@Autowired
private MyService myServiceWithBeanA;
@Autowired
private MyService myServiceWithBeanB;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.