最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Mybatis自定義攔截器不起作用的處理方案

 更新時間:2021年09月23日 12:05:31   作者:小胖學編程  
這篇文章主要介紹了SpringBoot整合Mybatis自定義攔截器不起作用的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot整合Mybatis自定義攔截器不起作用

Mybatis插件生效的方式:

1. 原始的讀取mybatis-config.xml文件

該方式和Spring無關(guān),是通過反射的形式創(chuàng)建插件對象,此時會執(zhí)行org.apache.ibatis.plugin.Interceptor#setProperties方法,以讀取配置參數(shù)。

mybatis:
  mapper-locations: classpath*:/mapping/*.xml
  type-aliases-package: com.tellme.pojo
  #讀取全局配置的地址
  config-location: classpath:mybatis-config.xml

在resource目錄下配置mybatis的全局配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="multipleResultSetsEnabled" value="true"/>
        <setting name="useColumnLabel" value="true"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="useGeneratedKeys" value="true"/>
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <setting name="defaultStatementTimeout" value="25000"/>
    </settings>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer"/>
        <typeAlias alias="Long" type="java.lang.Long"/>
        <typeAlias alias="HashMap" type="java.util.HashMap"/>
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
        <typeAlias alias="ArrayList" type="java.util.ArrayList"/>
        <typeAlias alias="LinkedList" type="java.util.LinkedList"/>
    </typeAliases>
    <!--配置的插件名-->
    <plugins>
        <plugin interceptor="com.xxx.yyy.plugins.PrintSqlInfoInterceptor"/>
    </plugins>
</configuration>

2. 與SpringBoot容器整合

網(wǎng)上很多方案說:mybatis自定義攔截器上加上@Component注解便可以生效。但是我將自定義攔截器放入到Spring容器中,自定義攔截器卻失效了。

然后找到了springboot配置多數(shù)據(jù)源后mybatis攔截器失效文章,說是自定義配置了數(shù)據(jù)源導致了攔截器失效。

2.1 mybatis的自動裝載

源碼位置:org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

@Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnBean(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
  private static Log log = LogFactory.getLog(MybatisAutoConfiguration.class);
  @Autowired
  private MybatisProperties properties;
   //會依賴注入Spring容器中所有的mybatis的Interceptor攔截器
  @Autowired(required = false)
  private Interceptor[] interceptors;
   ...
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setVfs(SpringBootVFS.class);
    if (StringUtils.hasText(this.properties.getConfigLocation())) {
      factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
    }
    factory.setConfiguration(properties.getConfiguration());
    //手動放入到了setPlugins方法中。
    if (!ObjectUtils.isEmpty(this.interceptors)) {
      factory.setPlugins(this.interceptors);
    }
    if (this.databaseIdProvider != null) {
      factory.setDatabaseIdProvider(this.databaseIdProvider);
    }
    if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
      factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
    }
    if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
      factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
    }
    if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
      factory.setMapperLocations(this.properties.resolveMapperLocations());
    }
    return factory.getObject();
  }
   ...
}

上面源碼中:自動注入了Interceptor[]數(shù)組(我們只需將mybatis的自定義攔截器對象放入到Spring容器中)。后續(xù)放入了sqlSessionFactory中。

但是項目中雖然自定義配置了sqlSessionFactory類,但卻未設(shè)置factory.setPlugins(this.interceptors);。導致即使將自定義攔截器放入到Spring容器,但卻不生效。

解決方法,需要手動修改自定義的sqlSessionFactory類。

3. 在mybatis-config.xml配置又放入Spring容器

這種情況下,mybatis自定義攔截器會被執(zhí)行兩次。即在mybatis-config.xml配置的攔截器會通過反射的方式創(chuàng)建攔截器,放入Spring容器的攔截器也會被初始化。

源碼位置:org.mybatis.spring.SqlSessionFactoryBean#buildSqlSessionFactory

protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
    Configuration configuration;
    ...讀取屬性中的plugins,即org.mybatis.spring.SqlSessionFactoryBean#setPlugins設(shè)置的。
    if (!isEmpty(this.plugins)) {
        for (Interceptor plugin: this.plugins) {
            configuration.addInterceptor(plugin);
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Registered plugin: '" + plugin + "'");
            }
        }
    }
    ...解析xml配置(通過反射創(chuàng)建攔截器對象)
    if (xmlConfigBuilder != null) {
        try {
            xmlConfigBuilder.parse();
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Parsed configuration file: '" + this.configLocation + "'");
            }
        } catch(Exception ex) {
            throw new NestedIOException("Failed to parse config resource: " + this.configLocation, ex);
        } finally {
            ErrorContext.instance().reset();
        }
    }
    return this.sqlSessionFactoryBuilder.build(configuration);
}

最終會執(zhí)行到:

private void pluginElement(XNode parent) throws Exception {
    if (parent != null) {
        for (XNode child: parent.getChildren()) {
            String interceptor = child.getStringAttribute("interceptor");
            Properties properties = child.getChildrenAsProperties();
            //反射創(chuàng)建mybatis的插件。
            Interceptor interceptorInstance = (Interceptor) resolveClass(interceptor).newInstance();
            interceptorInstance.setProperties(properties);
            configuration.addInterceptor(interceptorInstance);
        }
    }
}

SpringBoot 自定義Mybatis攔截器

開發(fā)過程中經(jīng)?;匦枰獙σ獔?zhí)行的sql加以自定義處理,比如分頁,計數(shù)等。通過 MyBatis 提供的強大機制,使用插件是非常簡單的,只需實現(xiàn) Interceptor 接口,并指定想要攔截的方法簽名即可。

@Intercepts({@Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class,ResultHandler.class})})
public class MyPageInterceptor implements Interceptor {
    private static final Logger logger= LoggerFactory.getLogger(MyPageInterceptor.class);
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        logger.warn(invocation.toString());
        return invocation.proceed();
    }
    @Override
    public Object plugin(Object o) {
        return Plugin.wrap(o,this);
    }
    @Override
    public void setProperties(Properties properties) {
        logger.warn(properties.toString());
    }
}

我的配置

mybatis:
  type-aliases-package: me.zingon.pagehelper.model
  mapper-locations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true
    default-fetch-size: 100
    default-statement-timeout: 30

在springboot中要給mybatis加上這個攔截器,有三種方法,前兩種方法在啟動項目時不會自動調(diào)用自定義攔截器的setProperties方法。

第一種

直接給自定義攔截器添加一個@Component注解,當調(diào)用sql時結(jié)果如下,可以看到攔截器生效了,但是啟動時候并沒有自動調(diào)用setProperties方法。

第二種

在配置類里添加攔截器,這種方法結(jié)果同上,也不會自動調(diào)用setProperties方法。

@Configuration
public class MybatisConfig {
    @Bean
    ConfigurationCustomizer mybatisConfigurationCustomizer() {
        return new ConfigurationCustomizer() {
            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                configuration.addInterceptor(new MyPageInterceptor());
            }
        };
    }
}

第三種

這種方法就是跟以前的配置方法類似,在yml配置文件中指定mybatis的xml配置文件,注意config-location屬性和configuration屬性不能同時指定

mybatis:
  config-location: classpath:mybatis.xml
  type-aliases-package: me.zingon.pagehelper.model
  mapper-locations: classpath:mapper/*.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <package name="me.zingon.pacargle.model"/>
    </typeAliases>
    <plugins>
        <plugin interceptor="me.zingon.pagehelper.interceptor.MyPageInterceptor"> 
            <property name="dialect" value="oracle"/>
        </plugin>
    </plugins>
</configuration>

可以看到,在啟動項目的時候setProperties被自動調(diào)用了

前兩種方法可以在初始化自定義攔截器的時候通過 @Value 注解直接初始化需要的參數(shù)。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis實現(xiàn)三級樹查詢的示例代碼

    MyBatis實現(xiàn)三級樹查詢的示例代碼

    在實際項目開發(fā)中,樹形結(jié)構(gòu)的數(shù)據(jù)查詢是一個非常常見的需求,比如組織架構(gòu)、菜單管理、地區(qū)選擇等場景都需要處理樹形數(shù)據(jù),本文將詳細講解如何使用MyBatis實現(xiàn)三級樹形數(shù)據(jù)的查詢,需要的朋友可以參考下
    2024-12-12
  • drools中使用function的方法小結(jié)

    drools中使用function的方法小結(jié)

    當我們在drools中編寫規(guī)則時,有些時候存在重復的代碼,那么我們是否可以將這些重復代碼抽取出來,封裝成一個function來調(diào)用呢?那么在drools中如何自定義function?下面小編給大家介紹下drools中使用function的方法,需要的朋友可以參考下
    2022-05-05
  • 帶你了解Java的類和對象

    帶你了解Java的類和對象

    下面小編就為大家?guī)硪黄胬斫釰ava類和對象。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • 解決try-catch捕獲異常信息后Spring事務(wù)失效的問題

    解決try-catch捕獲異常信息后Spring事務(wù)失效的問題

    這篇文章主要介紹了解決try-catch捕獲異常信息后Spring事務(wù)失效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JAVA實現(xiàn)Base64編碼的三種方式

    JAVA實現(xiàn)Base64編碼的三種方式

    本文主要介紹了JAVA實現(xiàn)Base64編碼的三種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • java實現(xiàn)多人多牌數(shù)比較游戲

    java實現(xiàn)多人多牌數(shù)比較游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)多人多牌數(shù)比較游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • JavaWeb工程中集成YMP框架快速上手(二)

    JavaWeb工程中集成YMP框架快速上手(二)

    YMP是一個非常簡單、易用的一套輕量級JAVA應(yīng)用開發(fā)框架,設(shè)計原則主要側(cè)重于簡化工作任務(wù)、規(guī)范開發(fā)流程、提高開發(fā)效率。對YMP框架感興趣的小伙伴們可以參考一下
    2016-02-02
  • SpringBoot啟動多數(shù)據(jù)源找不到合適的驅(qū)動類問題

    SpringBoot啟動多數(shù)據(jù)源找不到合適的驅(qū)動類問題

    這篇文章主要介紹了SpringBoot啟動多數(shù)據(jù)源找不到合適的驅(qū)動類問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java查看本機端口是否被占用源碼

    Java查看本機端口是否被占用源碼

    這篇文章主要介紹了Java查看本機端口是否被占用的主要原理,并結(jié)合具體實例給出了操作方法,需要的朋友可以參考下
    2017-09-09
  • web.xml中servlet, bean, filter, listenr 加載順序_動力節(jié)點Java學院整理

    web.xml中servlet, bean, filter, listenr 加載順序_動力節(jié)點Java學院整理

    這篇文章主要介紹了web.xml中servlet, bean, filter, listenr 加載順序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

民权县| 兴化市| 芦溪县| 淅川县| 靖远县| 沂源县| 舟曲县| 烟台市| 遂平县| 贵定县| 特克斯县| 洱源县| 阜阳市| 霍山县| 三穗县| 右玉县| 沂源县| 江西省| 开化县| 西充县| 鹤山市| 顺义区| 富裕县| 阿勒泰市| 霍城县| 易门县| 即墨市| 湖北省| 时尚| 兴仁县| 北海市| 清苑县| 金阳县| 湖州市| 攀枝花市| 休宁县| 双桥区| 屯留县| 应城市| 东明县| 比如县|