使用MyBatis-Spring注入mapper接口时哪种方式更好

时间:2015-06-04 06:30:48

标签: java database spring mybatis

我想知道通过构造函数参数和via属性注入mapper接口有什么区别。

代码段如下:

通过构造函数参数

<bean id="mapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="com.example.mybatis.SomeMapper"/>
  <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>


<bean id="ServiceImpl" class="com.example.service.SomeServiceImpl">
  <constructor-arg ref="mapper"/>
</bean>

爪哇

public class SomeServiceImpl { 
  private final SomeMapper mapper;

  public SafeBoxDao(SomeMapper mapper) {
    this.mapper = mapper;
  }
}

通过财产

<bean id="mapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="com.example.mybatis.SomeMapper"/>
  <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>


<bean id="ServiceImpl" class="com.example.service.SomeServiceImpl">
  <property name="mapperInstance" ref="mapper" />
</bean>

爪哇

public class SomeServiceImpl {
  private SomeMapper mapper;

  public SafeBoxDao() {
    this.mapper = mapper;
  }

  public void setMapper(SomeMapper mapper) {
    this.mapper = mapper;
  }
}

是否存在差异,或者只是注入映射器的不同方式?

1 个答案:

答案 0 :(得分:1)

一般来说(即不限于您的问题)构造函数注入更好,因为它将与容器无关。因此,即使你从春季(在你的情况下不太可能,依赖于spring-mybatis模块)来说CDI,你也不必担心映射器被正确注入。

虽然严格地说在Spring作为容器的上下文中,但我更喜欢根据Spring Docs的建议给出setter注入。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-setter-injection

  

Spring团队一般都主张构造函数注入   使一个人能够将应用程序组件实现为不可变对象   并确保所需的依赖项不为null。此外   构造函数注入的组件总是返回给客户端   (调用)处于完全初始化状态的代码。作为旁注,大   构造函数参数的数量是一个糟糕的代码气味,暗示着   班级可能有太多的责任,应该重构   更好地解决问题的正确分离。