12

次のコードを使用して、xml 構成を使用して、1 つの Java クラスから 2 つの 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常にタイプ別です。しかし、構成には 2 つのハンドラーがあります。そのため、ハンドラー クラスをオートワイヤーしようとするときは、修飾子を指定する必要があります。この春までに、注入するインスタンスを解決できます。それ以外の場合、Spring は を示すエラーをスローしますNoSuchBeanDefinitionFoundError。期待の 1 つが 2 つ見つかりました。

それが役立つことを願っています。

于 2013-07-05T20:21:07.170 に答える
-1

Spring Docsのセクション 5.9.3から:

アノテーション駆動型の注入を名前で表現する場合は、技術的に @Qualifier 値を介して Bean 名を参照できる場合でも、主に @Autowired を使用しないでください。代わりに、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 に答える