![](/img/trans.png)
[英]Spring: How to create two distinct beans from the same class using annotations?
[英]Spring creates two beans from one class using annotations
我可以使用以下代碼使用xml配置從一個java類中的兩個bean創建:
<context:component-scan base-package="some.package"/>
<bean id="dependentBean" class="some.package.DependentBean">
<property name="firstBean" ref="firstBean"/>
</bean>
<bean id="firstBean" class="some.package.Handler">
<constructor-arg index="0" ref="service"></constructor-arg>
<property name="defaultUrl" value="url/first"></property>
</bean>
<bean id="secondBean" class="some.package.Handler">
<constructor-arg index="0" ref="service"></constructor-arg>
<property name="defaultUrl" value="url/second"></property>
</bean>
我的目標是將firstBean和secondBean移動到基於java的配置,如下所示:
package some.package;
@Configuration
public class Configuration {
@Bean(name="firstBean")
public Handler firstHandler(Service service){
Handler handler= new Handler(service);
handler.setDefaultTargetUrl("url/first");
return handler;
}
@Bean(name="secondBean")
public Handler secondHandler(Service service){
Handler handler = new Handler(service);
handler.setDefaultTargetUrl("url/second");
return handler;
}
}
但是當上下文開始加載時,spring會拋出以下異常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'firstBean' is defined
然而,它適用於這種情況:
package some.package;
@Component
public class Filter{
private Handler handler;
@Autowired
public Filter(@Qualifier("secondBean") Handler handler) {
this.handler = handler;
}
}
處理程序實現:
public class Handler {
private Service service;
@Autowired
public Handler(Service service) {
this.service = service;
}
}
@Autowired
總是按類型。 但是您的配置中有兩個處理程序。 因此,當您嘗試自動裝配處理程序類時,必須指定限定符。 到這個春天可以解決注入的實例。 否則,spring會拋出顯示NoSuchBeanDefinitionFoundError
的錯誤。 預計一發現兩個。
希望有所幫助。
從Spring Docs ,第5.9.3節:
如果您打算按名稱表達注釋驅動的注入,請不要主要使用@Autowired,即使技術上能夠通過@Qualifier值引用bean名稱。 相反,使用JSR-250 @Resource注釋,該注釋在語義上定義為通過其唯一名稱標識特定目標組件,聲明的類型與匹配過程無關。
在5.9.5節中有一個例子,但是對於你的代碼,你的Filter類應該如下所示:
package some.package;
@Component
public class Filter {
private Handler handler;
@Resource(name="secondBean")
public Filter(Handler handler) {
this.handler = handler;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.