Spring和Mybatis的底层是什么

Spring整合MyBatis的底层原理分为以下几点:1、Mybatis如何生成代理对象;2、Spring中如何声明一个bean;3、模拟代理对象转化Spring的bean过程。其中,Mybatis如何生成代理对象在org.mybatis:mybatis.jar包中给我们提供了一些方法。

Spring和Mybatis的底层是什么-Worktile社区

一、Mybatis如何生成代理对象

在 org.mybatis:mybatis.jar包中给我们提供了一些方法。下面代码是运用mybatis来生成代理对象。

public class MybatisTest {
    public static void main(String[] args) throws IOException {
            // 1. 创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 2. 加载SqlMapConfig.xml配置文件
            InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
            // 3. 创建SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
            // 4. 创建SqlSession对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 5.执行sql
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 获得一个(动态代理)UserMapper接口的实现类对象
            System.out.println(userMapper.selectById());
            // 6.释放资源
            sqlSession.close();
        }
    }

二、Spring中如何声明一个bean

定义bean分为两种方式:

名列前茅种:声明式,例如:我们通常使用的@Bean注解,@Service注解,@Component注解等等。

第二种:编程式 ,运用BeanDefinition来创建一个bean,下面看代码:

public class User {
    public void fff(){
        System.out.println("初始化方法");
    }
}
public static void main(String[] args) {
        //使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配置。相比XML配置,更加便捷。
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(AppConfig.class);
 
        //获取beanDefinition对象
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        //创建User类的bean
        beanDefinition.setBeanClass(User.class);
        beanDefinition.setScope("prototype"); //bean单例模式改为原型模式
        beanDefinition.setInitMethodName("fff"); //设置bean的初始化方法
        //设置bean的名称
        applicationContext.registerBeanDefinition("xxx",beanDefinition);
        applicationContext.refresh();
          /**
         * 打印结果
         * 初始化方法
         * com.example.service.User@3b94d659
         * 初始化方法
         * com.example.service.User@24b1d79b
         * 初始化方法
         * com.example.service.User@68ceda24
         */
        System.out.println(applicationContext.getBean("xxx"));
        System.out.println(applicationContext.getBean("xxx"));
        System.out.println(applicationContext.getBean("xxx"));
 
 
 
//        UserService userService = applicationContext.getBean(UserService.class);
//        userService.test();
    }

通过上述代码我们可以使用BeanDefinition来创建一个bean。但是如果我的User类如果是一个接口通过BeanDefinition就不能实现了。我们可以通过FactoryBean来创建bean。

在下面代码:由于beanDefinition.setBeanClass(FactoryBeanTest.class);这行代码我们创建的是FactoryBeanTest.class这个类型的bean,但是FactoryBeanTest 类实现了FactoryBean这个接口最后返回给我们一个User类型的bean。这样我们就实现了动态的获取bean。

public class FactoryBeanTest implements FactoryBean {
    //getObject方法返回的bean,会放到spring容器里面去
    @Override
    public Object getObject() throws Exception {
        return new User();
    }
    //getObjectType方法是返回bean的类型
    @Override
    public Class<?> getObjectType() {
        return null;
    }
}
public class TestApplication {
    public static void main(String[] args) {
        //使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配置。相比XML配置,更加便捷。
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(AppConfig.class);
        //获取beanDefinition对象
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        //创建User类的bean
        beanDefinition.setBeanClass(FactoryBeanTest.class);
        //设置bean的名称
        applicationContext.registerBeanDefinition("xxx",beanDefinition);
        applicationContext.refresh();
        System.out.println(applicationContext.getBean("xxx"));
 
    }
}

三、模拟代理对象转化Spring的bean过程

首先我们通过Proxy.newProxyInstance方法去模拟一个代理对象,然后通过FactoryBean将这个代理对象放入SpringBean容器中。然后通过调用UserService.test方法我们可以发现:在执行UserService.test方法时会调用userMapper代理对象的selectById())的方法,

那么在调用代理对象时会先调用代理对象的代理逻辑里面也就是invoke方法,然后再去调用代理对象的selectById())的方法。

这样我们就做到了将mybatis的代理对象转化位bean放入到spring容器中。

public class FactoryBeanTest implements FactoryBean {
 
    @Override
    public Object getObject() throws Exception {
        /**
         * 参数:类加载器,代理的接口,代理的逻辑
         */
        Object proxyInstance = Proxy.newProxyInstance(FactoryBeanTest.class.getClassLoader(), new Class[]{UserMapper.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(method.getName());
                return null;
            }
        });
        return proxyInstance;
    }
 
    @Override
    public Class<?> getObjectType() {
        return UserMapper.class;
    }
}
/**
 * 在spring boot中设置的IOC容器中设置包扫描
 */
@ComponentScan("com.example.*")
@Configuration
public class AppConfig {
}
public class TestApplication {
    public static void main(String[] args) {
        //使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配置。相比XML配置,更加便捷。
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(AppConfig.class);
        //获取beanDefinition对象
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        //创建User类的bean
        beanDefinition.setBeanClass(FactoryBeanTest.class);
        //设置bean的名称
        applicationContext.registerBeanDefinition("xxx",beanDefinition);
        applicationContext.refresh();
       UserService userService = applicationContext.getBean(UserService.class);
       userService.test();
    }
}

来源:本文为CSDN博主「愉悦滴帮主)」的原创文章
原文链接:https://blog.csdn.net/qq_45065241/article/details/117526487

延伸阅读

Mybatis是什么

MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。

MyBatis 是一款优异的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

MyBatis特点

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的ORM字段关系映射。
  • 提供对象关系映射标签,支持对象关系组建维护。
  • 提供xml标签,支持编写动态sql。

文章标题:Spring和Mybatis的底层是什么,发布者:小编,转载请注明出处:https://worktile.com/kb/p/38809

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编认证作者
上一篇 2023年2月18日 下午11:20
下一篇 2023年2月19日 下午2:40

相关推荐

  • 服务器编程可以开什么公司

    服务器编程技术是开启众多商业机会大门的关键。可以基于此技术创建的公司类型主要有1、云服务提供商、2、软件即服务公司(SaaS)、3、数据中心和托管服务、4、网络安全解决方案提供商。特别地,云服务提供商是一个值得深入探讨的方向。随着企业数字化转型的加速,对于可靠、灵活的云计算资源的需求日益增长。作为云…

    2024年4月28日
    1100
  • 从零开始学编程的人叫什么

    编程新手或编程初学者通常被称为“新手程序员”或“编程门外汉”,它们通常用来形容从零开始学习编程的人。在扩展这一点,编程新手是指那些刚刚开始接触计算机编程语言和技术的人。他们可能对编程概念陌生,需要从基础知识如变量、循环和条件语句这样的初级概念开始学习。对编程初学者来说,建议从选择一种合适的入门级编程…

    2024年4月28日
    1400
  • 模具编程用什么软件

    在模具编程行业中,多个软件都扮演着至关重要的角色。1、MASTERCAM广泛用于模具设计和编程,因其强大的2D和3D加工能力;2、UG/NX具有先进的设计工具和流程仿真功能,深受工程师青睐;3、SolidWorks以其用户友好的界面和高效的设计工具而备受欢迎;4、Pro/ENGINEER(现称Cre…

    2024年4月25日
    4400
  • 网络编程是什么意思

    网络编程指的是在计算机程序中实现网络交互的过程,通常涉及1、传输控制协议/互联网协议(TCP/IP),以及2、应用层协议等编程接口的使用。通过网络编程,不同的计算机可以通过网络进行数据的交换,实现资源共享与通信。特别是在TCP/IP协议中,网络程序设计者必须理解如何利用这一标准网络协议来建立可靠的数…

    2024年4月27日
    1600
  • 预测股票需要学什么编程

    学习Python、统计学、机器学习是预测股票时至关重要的。在这些技能中,Python的重要性不言而喻。Python是一种流行且功能强大的编程语言,广泛应用于金融分析和量化交易领域。其丰富的库和框架,如NumPy、Pandas、Scikit-learn,使得数据处理、统计分析和机器学习模型构建更为高效…

    2024年4月27日
    2100
  • 编程用到的软件叫什么名字

    编程活动中常用的软件主要包括1、集成开发环境(IDE),2、文本编辑器,3、版本控制系统。具体来说,集成开发环境(IDE)提供了一站式的编程环境,它集成了代码编辑、编译、调试等功能于一体,极大地提高了开发效率。在众多IDE中,例如Visual Studio对于C#以及其他.NET语言开发者而言,提供…

    2024年4月27日
    1300
  • vscode为什么存储错误

    当您在使用VSCode(Visual Studio Code)时,如果遇到存储错误,这可能是由于权限不足、磁盘空间不足、文件路径问题、扩展冲突等原因造成的。在VSCode中权限不足可能是最常见的原因,因为如果VSCode没有适当的写权限,它无法修改或保存文件。另一个常见原因是磁盘空间不足,如果您的磁…

    2024年4月3日
    10600
  • 编程教育能改变什么吗

    编程教育能够改变思维模式、推动技术革新、增强问题解决能力。以思维模式的改变为例,学习编程能教给学生如何逻辑性地分析问题,他们学会将大问题分解为小块,然后逐一解决,这种系统性思考是编程教育的一大益处。这不仅限于计算机科学问题,逻辑思维和问题解构技巧在生活的方方面面都是适用的。 一、培养解决问题的能力 …

    2024年4月27日
    2500
  • 对编程有什么想法和目标

    成为一名优秀的程序员通常需要掌握编码技能、算法逻辑、解决问题的能力和持续学习的意愿。 然而,具体的目标则因个人而异,可以是专精某一领域的专家,如机器学习,也可以是成为全栈开发者,掌握前后端所有必需的技能。还有的目标可能是为了解决特定的技术挑战,或是创造创新的应用和服务。无论目标如何,关键在于不断学习…

    2024年4月27日
    1700
  • okr用什么软件做

    okr可用软件有:1、Worktile;2、PingCode Goals;3、Zokri;4、Aha!;5、Weekdone;6、飞书 OKR;7、7Geese。Worktile 还是一个知名的项目管理工具,比如它曾在2021年36氪发布的中国软件金榜-项目管理系列榜单总榜排名名列前茅。 一、Wor…

    2023年4月20日
    39300

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部