16

Javaベースの構成で、列挙型をBean参照にマップするマップを変換して純粋なJava構成(現在はXMLおよび動作中)にしようとしていますが、ドキュメントに何も見つからないようです。

現在、私のXMLはそうです。

<util:map id="colourHanders" key-type="com.example.ColourEnum"
          value-type="com.example.ColourHandler">
    <entry key="white" value-ref="whiteColourHandler"/>
    <entry key="blue" value-ref="blueColourHandler"/>
    <entry key="red" value-ref="redColourHandler"/>
</util:map>

簡単だと思いますが、Pure Javaでこれを表現する方法については何も見つかりません(したがって、XML構成ファイルはありません)。

ノート; Beanは、ColourHandler@Componentアノテーションを使用して作成されます。

@Component
public class RedColourHandler implements ColourHander{
.....
}

colourHandlersのマップはそのように参照されます。

@Resource(name="colourHandlers")
    private Map<ColourHandlerEnum, ColourHandler> colourHandlers;

ありがとう、

イアン。

4

5 に答える 5

15

あなたはおそらくこのようなものが欲しいでしょう:

@Configuration
public class MyConfiguration {
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() {
        Map<ColourEnum, ColourHandler> map = new EnumMap<>();
        map.put(WHITE, whiteHandler());
        // etc
        return map;
    }

    @Bean public ColourHandler whiteHandler() {
        return new WhiteHandler();
    }
}

ハンドラーをsとして保持する必要がある場合は@Component、それらを構成クラスに自動配線できます。

@Configuration
public class MyConfiguration {
    @Autowired private WhiteColourHandler whiteColourHandler;

    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() {
        Map<ColourEnum, ColourHandler> map = new EnumMap<>();
        map.put(WHITE, whiteColourHandler);
        return map;
    }
}
于 2012-11-08T16:42:48.070 に答える
5

ColorHandlerごとに一意のclass/@ Componentがすでにあるので、Springに何を使用するかを考えさせます(@Autowireインジェクションや追加の作成メソッドは必要ありません)。

@Configuration
public class MyConfiguration {
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers(
            WhiteColourHandler whiteHandler, 
            BlueColourHandler blueHandler, 
            RedColourHandler redHandler) {
        Map<ColourEnum, ColourHandler> map = new EnumMap<>();
        map.put(WHITE, whiteHandler);
        map.put(BLUE, blueHandler);
        map.put(RED, redHandler);
        return map;
    }
}
于 2017-09-03T10:39:39.620 に答える
2

これは実際には非常に単純ですが、次の方法を知っておく必要があります。

 @Autowired private ColourHandler whiteColourHandler;
 ...

 public Map<ColourEnum, ColourHandler> getColourHander() {
     Map<ColourEnum, ColourHandler> result = ...;
     map.put( ColourEnum.white, whiteColourHandler );
     ...
     return map;
 }

秘訣は、Beanを構成に注入できることです。

于 2012-11-08T16:42:51.860 に答える
2

受け入れられた回答と同様ですが、コンポーネントを自動配線する代わりに、通常どおり構成クラスでBeanを宣言し、それらを引数としてMapBeanメソッドに渡すことができます。

@Configuration
public class MyConfiguration {
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers(ColourHandler whiteHandler) {
        Map<ColourEnum, ColourHandler> map = new EnumMap<>();
        map.put(WHITE, whiteHandler);
        return map;
    }

    @Bean public ColourHandler whiteHandler() {
        return new WhiteHandler();
    }
}

また、フィールド名がBean定義と同じ命名規則に従っている場合、@Resourceとしてのマップの挿入にはアノテーションの「name」パラメーターは必要ないことに注意してください。

つまり、これはnameパラメータなしで機能します。

@Resource
private Map<ColourHandlerEnum, ColourHandler> colourHandlers;

しかし、これにはそれが必要です:

@Resource(name="colourHandlers")
private Map<ColourHandlerEnum, ColourHandler> handlers;
于 2014-03-12T14:56:07.177 に答える
0

ColourHandlerクラス自体に独自の型を定義させることができます。これにより、新しい型を取得するときに構成クラスを変更し続ける必要がなくなります。

public interface ColourHander {
    ColourEnum getType();
}
@Component
public class RedColourHandler implements ColourHander{
    @Override
    public ColourEnum getType() {
        return ColourEnum.RED;
    }
}

そして、configクラスで、すべてを取得しColourHandler、それらをそれらのタイプにマップします。

@Configuration
public class MyConfiguration {
    @Bean 
    public Map<ColourEnum, ColourHandler> colourHandlers(List<ColourHandler> colourHandlers) {
        return colourHandlers.stream().collect(toMap(ColourHandler::getType, x -> x));
    }
}

色ごとに複数のハンドラーがある場合に取得することに注意してくださいIllegalStateException。これは予想される動作であると思います。それをキャッチして、自分で投げることができます。

于 2020-11-22T07:38:19.233 に答える