1

私は単純なPOJOを持っています:

class MyClass {
  int a;
  String str;
  Strategy strategy;

}

ここで、Strategy は、Spring シングルトン Bean として定義された有限数の実装を持つインターフェイスです。このクラスのオブジェクトをDBから取得したい(戦略フィールドの場合、テーブルに単純なIDフィールドがあります)。したがって、テーブルの ID フィールドに応じて、新しく作成された MyClass インスタンスに既に存在する戦略の実装を挿入したいと考えています。これを達成するための最良の方法は何ですか?私はディスクリミネーターについて考えましたが、それは常に春によって管理されていない新しいインスタンスを作成します

4

3 に答える 3

3

私の理解が正しければ、次のバリアントを提供できます。Springコンテキストから適切な戦略 Bean を取得するタイプのMyBatisTypeHandlerを作成します。Strategy何も忘れていないことを願っています。

詳細:

MyClass {
private Strategy strategy;
}
StrategyA implements Strategy - "a" id in DB
StrategyB implements Strategy - "b" id in DB

1) spring-context.xml:

<bean id="strategyA" class="test.mybatis.inject.StrategyA" scope="singleton"></bean>
<bean id="strategyB" class="test.mybatis.inject.StrategyB" scope="singleton"></bean>

2) Spring コンテキスト プロバイダーを作成します。

public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext context;
    public static ApplicationContext getApplicationContext() {
        return context;
    }
    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        context = ctx;
    }
}    

3) プロバイダー Bean の説明を spring-context.xml に追加します。

<bean id="applicationContextProvder" class="test.mybatis.inject.ApplicationContextProvider"/>

4) StrategyTypeHandler を作成します。

@MappedTypes(value={Strategy.class})
public class StrategyTypeHandler implements TypeHandler<Strategy> {
    ...
    public Strategy getResult(ResultSet rs, String columnName) throws SQLException {
        switch(rs.getString(columnName)){  //for Java 1.7 & above
            case "a":
                return (StrategyA)ApplicationContextProvider.getApplicationContext().getBean(StrategyA.class);
            case "b":
                return (StrategyB)ApplicationContextProvider.getApplicationContext().getBean(StrategyB.class);
            }
        return null;
    }
}    

5) MyClassMapper.xml:

<result column="strategy_id" property="strategy" jdbcType="VARCHAR" typeHandler="test.mybatis.inject.StrategyTypeHandler"/>

走る。

于 2013-05-29T16:05:49.580 に答える
1

Spring 管理の Bean ではなく、Strategy インターフェイスを列挙型に置き換えることはできますか?

- 編集 -

Spring 管理の Bean が必要なため、コンテナーの外部で作成されたオブジェクトの Spring インジェクションを有効にするため、1 つのオプションは AOP を調査することです。

Spring の依存関係を任意のオブジェクトに注入する方法については、Spring のドキュメントのこちらを参照してください。

于 2013-05-28T13:23:12.600 に答える
0

あなたは見たいかもしれません

<context:spring-configured />

これにより、あなたが望むものを達成することができます。

于 2013-06-01T09:23:10.037 に答える