当前位置: 首页 > news >正文

JDK动态代理(tedu)(内含源代码)

JDK动态代理(tedu)(内含源代码)

源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87546187

目录

  • JDK动态代理(tedu)(内含源代码)
  • `源代码下载链接地址:`[https://download.csdn.net/download/weixin_46411355/87546187](https://download.csdn.net/download/weixin_46411355/87546187)
    • 一、创建一个SpringBoot项目
    • 二、配置类
    • 三、service层
      • 3.1 接口类
      • 3.2 实现类
    • 四、JDK动态代理,根据目标类获取代理类的方法
    • 五、测试类
    • 六、测试结果
    • 问题:为什么 System.out.println(proxy);会打印事务开始和事务提交?

一、创建一个SpringBoot项目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、配置类

SpringConfig

package com.tedu.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@ComponentScan("com.tedu")
@Configuration
public class SpringConfig {}

三、service层

3.1 接口类

UserService

package com.tedu.service;public interface UserService {void addUser();void deleteUser();
}

3.2 实现类

package com.tedu.service;import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService{@Overridepublic void addUser() {System.out.println("完成用户新增");}@Overridepublic void deleteUser() {System.out.println("完成用户删除");}
}

四、JDK动态代理,根据目标类获取代理类的方法

package com.tedu.proxy;import com.sun.corba.se.spi.ior.ObjectKey;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class JDKProxy {public static Object getProxy(Object target){//1.获取类加载器ClassLoader classLoader = target.getClass().getClassLoader();//2.获取接口Class<?>[] interfaces = target.getClass().getInterfaces();//通过代理的类新创建一个代理的对象return Proxy.newProxyInstance(classLoader, interfaces, getInvocationHandler(target));}//代理对象执行方法是调用public static InvocationHandler getInvocationHandler(Object target){//这些代码都是写死的return new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("======================事务开始=============================");//执行目标(真实对象的方法)Object result = method.invoke(target, args);System.out.println("==========================事务提交============================");return result;}};}}

五、测试类

package com.tedu.test;import com.tedu.config.SpringConfig;
import com.tedu.proxy.JDKProxy;
import com.tedu.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class SpringTx {public static void main(String[] args) {ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = applicationContext.getBean(UserService.class);System.out.println(userService.getClass());UserService proxy = (UserService)JDKProxy.getProxy(userService);System.out.println(proxy.getClass());System.out.println(proxy);System.out.println(proxy.toString());//基于代理对象,执行业务操作 实现方法扩展proxy.addUser();proxy.deleteUser();}
}

六、测试结果

在这里插入图片描述

问题:为什么 System.out.println(proxy);会打印事务开始和事务提交?

因为System.out.println(proxy);默认等价于System.out.println(proxy.toString());虽然没有调用业务方法,但还是调用了目标对象的toString()方法,所以会出现事务开始和事务提交。

http://www.lryc.cn/news/34031.html

相关文章:

  • 【数据结构】二叉搜索树
  • 抢跑数字中国建设,青岛市统计系统考察团赴实在智能调研统计数字员工
  • 深浅拷贝——利用模拟实现basic_string深入理解
  • 大模型分布式系统
  • 【时序】时序预测任务模型选择如何选择?
  • 重温数据结构与算法之深度优先搜索
  • STM32F103驱动LD3320语音识别模块
  • 2023 最新可用Google镜像地址 长期更新
  • MATLAB算法实战应用案例精讲-【优化算法】蝗虫优化算法(GOA)及其算法变种(附matlab和python代码实现)
  • 数据结构与算法 顺序表、链表总结
  • Nginx集群搭建-三台
  • 【算法】图的存储和遍历
  • 文件如何批量复制保存在多个文件夹中
  • 16N60-ASEMI高压MOS管16N60
  • Open3D 多个点云配准(C++版本)
  • java实现Hbase 增删改查
  • 1109. 航班预订统计 差分数组
  • 图床搭建,使用typora上传
  • 低代码开发的优势是什么?
  • Ip2Resion线上部署报数据越界及错误处理
  • 致敬我的C++启蒙老师,跟着他学计算机编程就对了 (文末赠书5本)
  • CSS中的伪元素和伪类
  • 逻辑优化基础-rewrite
  • 案例27-单表从9个更新语句调整为2个
  • Wordpress paid-memberships-pro plugins CVE-2023-23488未授权SQLi漏洞分析
  • 【JavaWeb篇】JSTL相关知识点总结
  • 【蓝桥杯刷题】坑爹的负进制转换
  • react+antdpro+ts实现企业级项目二:Strapi及认证登陆模块
  • Android ANR trace日志如何导出
  • Windows SSH 配置和SCP的使用