动态代理是基于什么原理?

本文介绍了Java中的反射机制,这是一种让程序在运行时具备自省能力的基础功能。同时,文章探讨了动态代理这一机制,它允许开发者在运行时动态构建代理并处理方法调用,有助于调用者与实现者的解耦。

java是静态的强类型语言,但是因为提供了反射等机制,也就具备了部分动态类型的语言能。

反射机制是java语言提供的一种基础功能,赋予程序在运行时自省的能力。通过反射我们可以直接操作类或者对象

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都会用到。rmi、rpc等

动态代理主要是让调用者与实现者之间解耦。

jdk动态代理和cglib区别

jdk 是通过invocationHandler,被调用者必须实现接口。而cglib则不需要。

spring的动态代理可以通过proxy-target-class来制定是否启用cglib的方式

MyBatis动态代理的工作原理涉及多个核心类,包括Configuration、SqlSession、MapperRegistry、MapperProxyFactory、MapperProxy、MapperMethod等,以下是详细的工作流程介绍: #### 1. 配置加载 MyBatis启动时,首先会读取配置文件(如`mybatis-config.xml`)和映射文件(如`UserMapper.xml`),并将这些配置信息存储在`Configuration`对象中。这个对象是MyBatis的核心配置对象,包含了所有的映射信息、数据源信息等。 #### 2. Mapper注册 `MapperRegistry`负责管理所有的Mapper接口。在MyBatis初始化过程中,会扫描指定的包路径,将Mapper接口注册到`MapperRegistry`中。每个Mapper接口都会对应一个`MapperProxyFactory`,用于创建该接口的代理对象。 #### 3. 获取Mapper代理对象 当调用`SqlSession.getMapper(UserMapper.class)`时,实际上是通过`MapperRegistry`获取对应的`MapperProxyFactory`,然后使用该工厂创建`UserMapper`接口的代理对象。这个代理对象是基于JDK动态代理实现的,其核心是`MapperProxy`类。 ```java try (SqlSession sqlSession = sqlSessionFactory.openSession()) { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.selectById(1); System.out.println("User : " + user); } ``` #### 4. 方法调用 当调用代理对象的方法(如`userMapper.selectById(1)`)时,会触发`MapperProxy`的`invoke`方法。在这个方法中,会根据调用的方法信息创建`MapperMethod`对象,该对象封装了方法的相关信息,包括SQL语句、参数类型、返回值类型等。 #### 5. SQL执行 `MapperMethod`会根据方法信息从`Configuration`中获取对应的SQL语句,并使用`SqlSession`执行该SQL语句。执行过程中会处理参数绑定、结果映射等操作,最终返回查询结果。 ### 总结 MyBatis动态代理通过JDK动态代理机制,为Mapper接口创建代理对象。在方法调用时,将接口方法映射到具体的SQL语句,并使用`SqlSession`执行SQL,从而实现数据库操作。这种机制使得开发人员可以通过接口方法简洁地进行数据库操作,而无需编写繁琐的实现类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值