1

我有一个简单的 POJO:

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

}

其中 Strategy 是一个接口,它具有有限数量的实现,这些实现被定义为 spring 单例 bean。我希望从 DB 中检索此类的对象(对于策略字段,我在表中有一个简单的 ID 字段)。因此,我想根据表中的 ID 字段将已经存在的策略实现注入到新创建的 MyClass 实例中。实现这一目标的最佳方法是什么?我考虑过鉴别器,但它总是创建不受弹簧管理的新实例

4

3 回答 3

3

TypeHandler如果我理解正确,我可以提供下一个变体:为Type创建 MyBatis Strategy,从 Spring 上下文中获取适当的策略 bean。我希望我没有忘记任何事情。

细节:

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

1)弹簧上下文.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)在spring-context.xml中添加provider bean描述:

<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?

- 编辑 -

由于您需要 Spring 管理的 bean,因此一种选择是探索 AOP,因为它可以为在容器外部创建的对象启用 Spring 注入。

请参阅Spring 文档中的此处,了解如何将 Spring 依赖项注入任何对象。

于 2013-05-28T13:23:12.600 回答
0

你可能想看看

<context:spring-configured />

这将使您能够实现您想要的。

于 2013-06-01T09:23:10.037 回答