解决MyBatis Plus不支持多个MetaObjectHandler实现类_yu542771572的博客-CSDN博客

一、背景

  1. 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));
    }

}

四、可能存在的问题

  1. 不同MetaObjectHandler的执行顺序和覆盖
  • 可以使用@Order来对Handler进行排序
  1. 对MetaObject进行代理
  • 可以使用AopUtils工具获取原对象,防止对MasterMetaObjectHandler队形递归调用

原网址: 访问
创建于: 2021-08-04 18:52:13
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论