由MybatisPlus配置类未生效引出的问题到SpringBoot复写Bean

由MybatisPlus配置类未生效引出的问题到SpringBoot复写Bean

lixiangrong
2024-01-12 / 0 评论 / 45 阅读 / 正在检测是否收录...

1.在某微服务项目中,测试提出一个缺陷:在列表输入框选择条件,不点击查询而是点击翻页,点击后页面刷新,按照条件筛选出数据数量但不显示数据,其实,本质上就是分页查询的页号溢出问题。由于该项目使用的是MybatisPlus,要解决这个问题其实只要写一个MybatisPlus配置类,中设置一个属性即可。
Test
2.但是发现这个配置类设置的这个属性值未生效,在启动类中获取bean发现这个属性依然是false,注释掉这个Bean后发现依然存在这个Bean,这时候就找到在该项目的jar包中已经存在这个Bean导致自己写的Bean未生效。
Test
3.于是思路就是要重写这个Bean,可以实现Spring中的接口:Bean定义注册后置处理器BeanDefinitionRegistryPostProcessor。代码如下:

MybatisPlusMyConfig

package jnpf.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * MyBatisPlus配置
 */
@Configuration
public class MybatisPlusMyConfig
{

    /**
     * @Author LiXiangrong
     * @Description 复写MybatisPlusInterceptor
     * @Date 2024/01/11 18:04:33
     * @Return com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor
     **/
    @Bean("mybatisPlusInterceptor1")
    public MybatisPlusInterceptor mybatisPlusInterceptor()
    {
        // 核心插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件(如果配置多个插件,切记分页最后添加)
        PaginationInnerInterceptor innerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); // dbType(数据库类型)
        innerInterceptor.setOverflow(true); // 默认值:false。溢出总页数后是否进行处理。
        interceptor.addInnerInterceptor(innerInterceptor);
        return interceptor;
    }
}

MyBeanDefinitionRegistryPostProcessor

package jnpf.config;

import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.stereotype.Component;

/**
 * @Author LiXiangrong
 * @Description 自定义的Bean定义注册后置处理器
 * @Date 2024/01/11 18:06:08
 **/
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor
{
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException
    {
        String bean1 = "mybatisPlusInterceptor";
        String bean2 = "mybatisPlusInterceptor1";
        // 复写MybatisPlusInterceptor
        // 若jar包和程序都注册了mybatisPlusInterceptor,就将程序里的bd覆盖掉jar包里的bd(继续使用jar包里的beanName,防止jar包中其它bean指定依赖了这个beanName)
        if (registry.containsBeanDefinition(bean1) && registry.containsBeanDefinition(bean2))
        {
            // 移除bean1,用bean2注册一个新的bean1,然后把bean2移除(复写了bean1)
            registry.removeBeanDefinition(bean1);
            registry.registerBeanDefinition(bean1, registry.getBeanDefinition(bean2));
            registry.removeBeanDefinition(bean2);
        }
    }

    @Override
    public void postProcessBeanFactory(@NotNull ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException
    {

    }
}
0

评论 (0)

取消