簡體   English   中英

Spring使用注釋從一個類創建兩個bean

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM