一、背景
- MybatisPlus不支持注入多个MetaObjectHandler实例
二、原因
查看MybatisPlusAutoConfiguration
类
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
...
// TODO 此处必为非 NULL
GlobalConfig globalConfig = this.properties.getGlobalConfig();
// TODO 注入填充器
if (this.applicationContext.getBeanNamesForType(MetaObjectHandler.class,
false, false).length > 0) {
MetaObjectHandler metaObjectHandler = this.applicationContext.getBean(MetaObjectHandler.class);
globalConfig.setMetaObjectHandler(metaObjectHandler);
}
...
}
三、解决方法
@Primary
@Component
public class PrimaryMetaObjectHandler implements MetaObjectHandler {
@Autowired
private List<MetaObjectHandler> handlers;
@Override
public void insertFill(MetaObject metaObject) {
handlers.stream().filter(o -> !o.equals(this)).forEach(o -> o.insertFill(metaObject));
}
@Override
public void updateFill(MetaObject metaObject) {
handlers.stream().filter(o -> !o.equals(this)).forEach(o -> o.updateFill(metaObject));
}
}
四、可能存在的问题
- 不同MetaObjectHandler的执行顺序和覆盖
- 可以使用@Order来对Handler进行排序
- 对MetaObject进行代理
- 可以使用AopUtils工具获取原对象,防止对MasterMetaObjectHandler队形递归调用