我可以使用以下代码使用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;
}
}
答案 0 :(得分:1)
@Autowired
总是按类型。但是您的配置中有两个处理程序。因此,当您尝试自动装配处理程序类时,必须指定限定符。到这个春天可以解决注入的实例。否则,spring会抛出显示NoSuchBeanDefinitionFoundError
的错误。预计会发现两个。
希望有所帮助。
答案 1 :(得分:-1)
来自Spring Docs,第5.9.3节:
如果您打算按名称表达注释驱动的注入,请不要主要使用@Autowired,即使技术上能够通过@Qualifier值引用bean名称。相反,使用JSR-250 @Resource注释,该注释在语义上定义为通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关。
第5.9.5节中有一个示例,但对于您的代码,您的过滤器类应如下所示:
package some.package;
@Component
public class Filter {
private Handler handler;
@Resource(name="secondBean")
public Filter(Handler handler) {
this.handler = handler;
}
}