我想知道通过构造函数参数和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;
}
}
是否存在差异,或者只是注入映射器的不同方式?
答案 0 :(得分:1)
一般来说(即不限于您的问题)构造函数注入更好,因为它将与容器无关。因此,即使你从春季(在你的情况下不太可能,依赖于spring-mybatis模块)来说CDI,你也不必担心映射器被正确注入。
虽然严格地说在Spring作为容器的上下文中,但我更喜欢根据Spring Docs的建议给出setter注入。
Spring团队一般都主张构造函数注入 使一个人能够将应用程序组件实现为不可变对象 并确保所需的依赖项不为null。此外 构造函数注入的组件总是返回给客户端 (调用)处于完全初始化状态的代码。作为旁注,大 构造函数参数的数量是一个糟糕的代码气味,暗示着 班级可能有太多的责任,应该重构 更好地解决问题的正确分离。