12

我可以使用以下代码使用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;
    }

}
4

2 回答 2

1

@Autowired总是按类型。但是您的配置中有两个处理程序。因此,当您尝试自动装配处理程序类时,您必须指定限定符。到这个春天可以解决注入哪个实例。否则,spring 会抛出错误显示NoSuchBeanDefinitionFoundError。预期一发现二。

希望有帮助。

于 2013-07-05T20:21:07.170 回答
-1

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;
    }

}
于 2013-07-05T20:47:37.720 回答