首页 > 其他分享 >MyBatis-09-FactoryBean的问题

MyBatis-09-FactoryBean的问题

时间:2024-04-16 22:55:48浏览次数:24  
标签:XML MapperFactoryBean 实例 09 setAttribute FactoryBean MyBatis

ListableBeanFactory#getBeanNamesForType(Class<?>)

这个方法的逻辑在对 FactoryBean 进行判断时,会使用 FactoryBean 的生成的对象的类型进行判断

  1. BD 的属性数据 AttributeAccessor.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE)
  2. 反射创建对象并调用 FactoryBean#getObjectType
  3. 实例化 Bean 并调用 FactoryBean#getObjectType

那么对于 MyBatis 这种,直接实例化 MapperFactoryBean 的 getObjectType 是不会返回确定的类型的,只有1和3会返回,如果在创建 BeanDefinition
时没有 setAttribute,那么就会发生提前实例化的问题

问题又在与这个提前实例化失败时 Spring 不会抛出异常停止应用的启动,而是将底层的异常捕获并打印 debug 日志

切实遇到的问题

公司在 MyBatis-Spring 的基础上自己进行了 SpringBoot 风格的适配,但是在创建 BeanDefinition 时没有 setAttribute,导致如果
XML的Mapper啊这些写得有问题,那么 MapperFactoryBean 在实例化时会依赖相关的 MyBatis 的 Bean 的构建,当构建失败,不会停止应用。

于是产生的问题是

  1. Dao/Mapper 都生成了对应的 MapperFactoryBean
  2. getBeanNamesForType 在没有找到时会遍历它们判断
  3. 实例化对应的 MapperFactoryBean -> 扫描 XML 文件 -> 解析报错 -> 抑制异常
  4. 重复 3 直到处理完毕

于是就造成了一旦 XML 写错,控制台就会打印大量日志,给人感觉像是一直死循环处理一样的

解决方案

实际上 Spring 和 MyBatis 在后续版本已经解决了这个这个问题,就是 setAttribute,但是公司的版本没有继续迭代

标签:XML,MapperFactoryBean,实例,09,setAttribute,FactoryBean,MyBatis
From: https://www.cnblogs.com/chenxingyang/p/18139472

相关文章

  • MyBatis-01-Demo
    数据库DDLCREATEDATABASE`mybatis_demo01`;--mybatis_demo01.`user`definitionCREATETABLE`user`(`id`intNOTNULLAUTO_INCREMENT,`username`varchar(100)DEFAULTNULL,`birthday`datetimeDEFAULTNULL,`sex`char(1)DEFAULTNULL,`address`......
  • MyBatis-02-别名
    别名TypeAliasRegistry默认注册了很多别名,构造函数注册的publicTypeAliasRegistry(){registerAlias("string",String.class);registerAlias("byte",Byte.class);registerAlias("char",Character.class);registerAlias("character"......
  • MyBatis-03-environment
    配置<environmentsdefault="default"><environmentid="default"><!--事务类型--><transactionManagertype="JDBC"/><!--数据源类型--><dataSourcetype="POOLED">&l......
  • mybatisplus
    mybatisplus如何实现获取信息通过扫描实体类并通过反射获取实体类信息作为数据库表信息约定:类名、变量名驼峰转下划线作为表名id字段默认为主键常用注解@TableName,@TableId,@TableField@TableField使用场景:成员变量为boolean并且名称为is开头,转化时会去掉is......
  • 【题解】P4307 [JSOI2009] 球队收益 / 球队预算
    P4307[JSOI2009]球队收益/球队预算题解题目传送门题意简述一共有\(n\)个球队比赛,输了赢了都会有相应的支出,现在让你安排\(m\)场比赛的输赢,是总支出最少。思路首先看到最小支出,状态不好定义,直接费用流,启动!。后文如果没有特殊说明,边的费用均为\(0\)。考虑建图,其......
  • CF1097F Alex and a TV Show 题解
    题目链接点击打开链接题目解法很牛的套路啊!看到集合并,且只要求奇偶性的问题,第一个想到\(bitset\)\(1,2,4\)操作都是好维护的,关键是第\(3\)个操作看到$\gcd$,首先想到莫反令\(c_{x,i}\)为集合\(x\)中数\(i\)的出现次数则\(c_{x,i}=\sum\limits_{i|j}\sum\limit......
  • 80、SpringBoot3 SpringSecurity Mybatisplus最新版 整合 实现登入权限控制
    1、导入pom依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apac......
  • SpringBoot+MybatisPlus 增删改查学习第三章 (C#转JAVA)
    packagecom.example.demo;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.example.demo.entity.Person;importcom.example.demo.mapper.PersonMapper;importcom.example.demo.service.PersonService;importorg.junit.jupiter.api.Test;i......
  • P2709 小B的询问
    原题链接题解莫队算法是局限性非常大的优化,离线+无修改,它通过邻近区间修改复杂度为\(O(1)\)的特性让区间排序,然后再做修改,排序的规则是按块排序,然后左端点\(l\)在一个块里的按右端点排序code#include<bits/stdc++.h>usingnamespacestd;inta[50005];structnode{......
  • mybatis-plus和pageHelper使用
    1、依赖<!--mybatis-plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!--分页插件pag......