我正在尝试使 MyBatis Mappers 可序列化(有点)。为此,我只想SqlSessionTemplate
通过 Java 配置将(这是不可序列化的东西)包装到一个作用域代理中......
@Configuration
@MapperScan(basePackages={"com.example.mybatis.mappers"}, sqlSessionTemplateRef="sqlSession")
public class SpringConfiguration {
@Bean
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)
public SqlSessionTemplate sqlSession(final SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
不幸的是,这不起作用,因为似乎要创建 SqlSessionTemplate 的范围代理,但最终注入 Mapper 的仍然是一个标准SqlSessionTemplate
(而不是它周围的代理),它以某种方式逃脱了代理。有问题的部分似乎是这种方法org.mybatis.spring.SqlSessionTemplate
......
@Override
public <T> T getMapper(Class<T> type) {
return getConfiguration().getMapper(type, this);
}
当然,this
这里指的是原始SqlSessionTemplate
对象,而不是它周围的 Proxy。
有没有办法强制我的作用域代理进入映射器?
当然,有效的方法是简单地使映射器本身成为范围代理,但这似乎不太优雅和简洁(并且需要我跳过对映射器的自动扫描,而是手动声明每个映射器),所以我更愿意制作有问题的对象一个作用域代理,因为它MapperProxy
本身已经是可序列化的并且可以被序列化 - 它只是被SqlSessionTemplate
.
编辑:当然还有一个问题是SqlSessionTemplate 没有默认构造函数,这也是一个问题,但一次一个......