私の理解が正しければ、次のバリアントを提供できます。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"/>
走る。