Spring设计模式,事务管理和代理模式的应用
扩充:贝叶斯定理答案见底。
设计模式对关于面向对象问题的具体解决方案.
1,单例多例
在设计单例模式时,要注意两个点
1.构造方法要私有
2.成员变量要私有
3.创建对象所用的方法要被synchronized修饰.(因为方法体中会涉及到判断当前成员对象是否为空,在饿汉模式下,会有多个线程来访问该方法,为了防止判断访问结果同时为空,从而创建多个对象,就要被synchronized修饰)
2,模版
所谓模板板式,就是在父类中定义算法的主要流程,而把一些个性化的步骤延迟到子类中去实现,父类始终控制着整个流程的主动权,子类只是辅助父类实现某些可定制的步骤
父类
public abstract class FatherClass {//人生public final void 人生(){学习();工作();爱情();}//学习public void 学习(){System.out.println("=========放学回家学到晚上12点不许睡觉===========");}//工作public void 工作(){System.out.println("============稳定就好===============");}//爱情(放飞自我)public abstract void 爱情();}
继承父类的类
package com.apesource.test;
//儿子
public class SonClass extends FatherClass{@Overridepublic void 学习() {System.out.println("=========开心就好,及格万岁============");}@Overridepublic void 爱情() {System.out.println("======肤白貌美大长腿.....=======");}
}
如果该方法被重写,那么结果是子类的内容。反之,则是父类的内容
- Spring中jdbcTemplate、hibernateTemplate等以Template结尾的
- 对数据库操作的类,它们就使用到模板模式。一般情况下,我们都是使用继承的方式来实现模板模式,但是Spring并没有使用这种方式,而是使用Callback模式与模板方法配合,既达到了代码复用的效果,同时增加了灵活性。
3,工厂
一个工厂可以根据传入参数的不同,而创建出来不同的对象。
4,代理(静态代理,动态代理)
功能:
1.中介隔离作用
2.方法增强
一.静态代理,静态代理中,代理在代码执行前已经被创建出来了。
动态代理,是代码执行的时候被创建出来的, 1.基于接口(jdk自带)2.基于子类(第三方)
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;子类
public class Test03 {public static void main(String[] args) {//1.创建被代理对象ISinger teng = new TengEr();//2.创建代理对象ISinger jinJiRen = (ISinger)Enhancer.create(teng.getClass(), new InvocationHandler() {@Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {Object obj = method.invoke(teng,objects);return obj;}});//3.使用jinJiRen.sing();}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test02 {public static void main(String[] args) {//1.被代理对象ISinger zhouJieLun = new ZhouJieLun();/*** 2.创建代理对象* ClassLoader loader被代理对象的类的加载器* Class<?>[] interfaces,被代理对象的类的字节数组* InvocationHandler h处理器对象* */ISinger jinJiRen = (ISinger) Proxy.newProxyInstance(zhouJieLun.getClass().getClassLoader(), zhouJieLun.getClass().getInterfaces(), new InvocationHandler() {/*** Object proxy, 被代理对象的引用* Method method,被代理对象类中的所有方法* Object[] args 被代理对象类中的所有方法的参数* Object 被代理对象类中的所有方法的返回值** */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法增强System.out.println("挑一个舞,打个球~~~");Object obj = method.invoke(zhouJieLun,args);//执行周杰伦唱歌方法,(执行被代理对象中的所有方法)return obj;}});//3.消费使用jinJiRen.sing();}
}
事务管理
1,在转账服务时,更新数据库时,可能会发生异常,就会导致金额不对
解决方法,1.被调用到的dao层语句,都拿着同一个对象,这个对象可以实现锁的功能。那么就要在dao层query和update语句中,增加一个Connection对象。threadLocal可以充当sql语句的锁对象
因为threadlocal有一个线程们的公共区域,完全可以实现当公共区有一个connection的时候,线程们完全不需要再考虑在去造很多connection。
ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
2.service层中,调用事务管理,当异常发生时,实现事务的回滚
①在dao层用到的连接工具类
package com.apesource.util;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;/*** @author * @version 1.0* @since 2023/9/15*/
public class ConnectionUtil {//1.线程区域对象ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();//2.数据源private DataSource dataSource;public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}Connection connection = null;//获取连接public Connection createConn(){try {//1.线程区域connection = threadLocal.get();//2.判断if (connection ==null){//创建连接connection = dataSource.getConnection();//保存threadLocal.set(connection);}return connection;} catch (SQLException throwables) {throwables.printStackTrace();}return null;}//关闭连接public void closeConn(){threadLocal.remove();//解除绑定}
}
在dao层的每一个语句都装配工具类
//装配连接工具类
ConnectionUtil connectionUtil;public void setConnectionUtil(ConnectionUtil connectionUtil) {
this.connectionUtil = connectionUtil;
}@Override
public void save(Student student) {
try {
queryRunner.update(connectionUtil.createConn(),"insert into student(sname,shobby,smoney) value(?,?,?)",student.getSname(),student.getShobby(),student.getSmoney());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
②在service层用到的事务管理工具类
package com.apesource.util;import java.sql.SQLException;/*** @author * @version 1.0* @since 2023/9/15*/
public class TransactionUtil {//装配连接工具类ConnectionUtil connectionUtil;public void setConnectionUtil(ConnectionUtil connectionUtil) {this.connectionUtil = connectionUtil;}//开启事务public void beginTransaction(){try {connectionUtil.createConn().setAutoCommit(false);} catch (SQLException throwables) {throwables.printStackTrace();}}//提交事务public void commitTransaction(){try {connectionUtil.createConn().commit();} catch (SQLException throwables) {throwables.printStackTrace();}}//回滚事务public void rollbackTransaction(){try {connectionUtil.createConn().rollback();} catch (SQLException throwables) {throwables.printStackTrace();}}//关闭事务public void closeTransaction(){try {connectionUtil.createConn().close();//关闭连接connectionUtil.closeConn();//解除绑定} catch (SQLException throwables) {throwables.printStackTrace();}}
}
service里的用到的事务管理
@Overridepublic void transfer(String sourceName, String targetName, int money) {try {//开启事务transactionUtil.beginTransaction();//1.查询用户信息Student sourceStudent = dao.findByName(sourceName);Student targetStudent = dao.findByName(targetName);//2.java代码中实现转账sourceStudent.setSmoney(sourceStudent.getSmoney()-money);targetStudent.setSmoney(targetStudent.getSmoney()+money);//3.修改数据库dao.update(sourceStudent);int a = 10/0;//模拟异常dao.update(targetStudent);//提交事务transactionUtil.commitTransaction();} catch (Exception e) {e.printStackTrace();//回滚事务transactionUtil.rollbackTransaction();}finally {//关闭事务transactionUtil.closeTransaction();}}
优化方法
优化方法
采用Beanfactory创建代理对象,代理对象可以用来方法增强,可以将被代理对象的方法不经过污染,就可以实现事务管理。
在这个案例中,controller是消费者
<!--注入被代理service-->
<bean id="serviceImp" class="com.apesource.service.StudentServiceImp">
<property name="dao" ref="daoImp"></property>
</bean><!--注入代理service-->
<bean id="proxySerivce" class="com.apesource.service.StudentServiceImp" factory-bean="factory" factory-method="createProxy"></bean>
<bean id="factory" class="com.apesource.factory.BeansFactory">
<property name="transactionUtil" ref="transactionUtil"></property>
<property name="toProxyService" ref="serviceImp"></property>
</bean><!--注入controller-->
<bean id="controllerImp" class="com.apesource.controller.StudentControllerImp">
<property name="studentService" ref="proxySerivce"></property>
</bean>
抽取方法用到了代理对象 ,BeansFactory代码如下:
package com.apesource.factory;import com.apesource.service.IStudentService;
import com.apesource.util.TransactionUtil;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @author * @version 1.0* @since 2023/9/15*/
public class BeansFactory {//装配被代理业务对象IStudentService toProxyService;public void setToProxyService(IStudentService toProxyService) {this.toProxyService = toProxyService;}//装配事务工具类TransactionUtil transactionUtil;public void setTransactionUtil(TransactionUtil transactionUtil) {this.transactionUtil = transactionUtil;}//创建代理对象public IStudentService createProxy(){return (IStudentService)Proxy.newProxyInstance(toProxyService.getClass().getClassLoader(), toProxyService.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object obj = null;//主业务方法try {transactionUtil.beginTransaction();obj = method.invoke(toProxyService,args);transactionUtil.commitTransaction();} catch (Exception e) {e.printStackTrace();transactionUtil.rollbackTransaction();} finally {transactionUtil.closeTransaction();}return obj;}});}
}
八年后的重逢:贝叶斯定理是一则随机事件的条件概率(或边缘概率)的定理,其中P(A|B)是在B发生的情况下A发生的可能性。也就是说,如果你喜欢他,那么他就会喜欢你。如果你对他好,他也会对你好的。因此,如果你表白,你需要相信他,将全部的情感完全吐露给对方,将真诚当成一生的信念,投入到爱情中,去充实彼此的关系,全心全意地去经营彼此的关系,将相互接纳、宽容、体谅和支持当作最可贵的宝贵财富。
相关文章:
Spring设计模式,事务管理和代理模式的应用
扩充:贝叶斯定理答案见底。 设计模式对关于面向对象问题的具体解决方案. 1,单例多例 在设计单例模式时,要注意两个点 1.构造方法要私有 2.成员变量要私有 3.创建对象所用的方法要被synchronized修饰.(因为方法体中会涉及到判断当…...
基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制
LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…...
Linux下git安装及使用
Linux下Git使用 1. git的安装 sudo apt install git安装完,使用git --version查看git版本 2. 配置git git config --global user.name "Your Name“ ##配置用户 git config --global user.email emailexample.com ##配置邮箱git config --global --list …...
python读取图片
要在Python中读取图片,你可以使用第三方库Pillow(Python Imaging Library,PIL)或OpenCV。以下是使用这两个库的示例: 使用Pillow库读取图片: 首先,确保你已经安装了Pillow库。如果还没有安装&am…...
虚幻4学习笔记(15)读档 和存档 的实现
虚幻4学习笔记 读档存档 B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732 读档 添加UI蓝图 SaveGame_UMG 添加Scroll Box 修改Scrollbar Thickness滚动条厚度 15 15 勾选 is variable 添加text 读档界面 添加背景模糊 添加UI蓝图 SaveGame_Slot …...
Spring面试题22:Spring支持哪些ORM框架?优缺点分别是什么?Spring可以通过哪些方式访问Hibernate?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些ORM框架?优缺点分别是什么? Spring 支持多种 ORM(对象关系映射)框架,其中包括: Hibernate:Hibernate 是一个强大的 ORM 框架…...
流行的Python库numpy及Pandas简要介绍
numpy.ndarray 是NumPy库中的主要数据结构,它是一个多维数组,用于存储和操作数值数据。NumPy是Python中用于数值计算的强大库,numpy.ndarray 是它的核心数据类型,提供了高效的数值运算和广泛的数学函数。 以下是 numpy.ndarray 的…...
【二、安装centOS】
下载 地址:https://mirrors.aliyun.com/centos/ 地址 1、https://mirrors.aliyun.com/centos/7.9.2009/ 2、https://mirrors.aliyun.com/centos/7.9.2009/isos/ 3、https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 选哪一个 可以选择第一个࿰…...
【动手学深度学习-Pytorch版】序列到序列的学习(包含NLP常用的Mask技巧)
序言 这一节是对于“编码器-解码器”模型的实际应用,编码器和解码器架构可以使用长度可变的序列作为输入,并将其转换为固定形状的隐状态(编码器实现)。本小节将使用“fra-eng”数据集(这也是《动手学习深度学习-Pytor…...
AUTOSAR 面试知识回顾
如果答不上来,就讲当时做了什么 1. Ethernet基础: 硬件接口: ECU到PHY: data 是MII总线, 寄存器控制是SMI总线【MDCMDIO两根线, half duplex】PHY输出(100BASE-T1): MDI总线,2 wire 【T1: twisted 1 pair …...
华为NFC设置教程(门禁卡/公交卡/校园卡等)
今天把华为NFC设置教程分享给大家 出门带门禁卡、校园卡、银行卡、身份证……东西又多,携带又麻烦,还容易搞丢,有没有一种方法可以把它们都装下?有!只要一部手机,出门不带卡包,各种证件&#x…...
基于微信小程序的音乐播放器设计与实现(源码+lw+部署文档+讲解等)
前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
如何取消显示Notepad++每行显示的CRLF符号
新电脑中重新安装了Nodepad,打开记事本后发现出现了许多黑底的CR|LF标记,特别碍眼。 如何取消呢? 视图 -> 显示符号 -> 取消勾选 显示行尾符操作步骤 预期效果...
数据结构与算法之时间复杂度和空间复杂度(C语言版)
1. 时间复杂度 1.1 概念 简而言之,算法中的基本操作的执行次数,叫做算法的时间复杂度。也就是说,我这个程序执行了多少次,时间复杂度就是多少。 比如下面这段代码的执行次数: void Func1(int N) {int count 0;for…...
TLS/SSL(十) session缓存、ticket 票据、TLS 1.3的0-RTT
一 TLS优化手段 TLS 为了提升握手速度而提出优化手段,主要是减少TLS握手中RTT消耗的时间关于session cache和session ticket,nginx关于ssl握手的地方都有影子 [指令] https面经 ① session 缓存 resume: 重用,复用 案例: 第二次访问www.baidu.com 说明&#x…...
C++设计模式_06_Decorator 装饰模式
本篇将会介绍Decorator 装饰模式,它是属于一个新的类别,按照C设计模式_03_模板方法Template Method中介绍的划分为“单一职责”模式。 “单一职责”模式讲的是在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随…...
MySQL 8.0数据库主从搭建和问题处理
错误处理: 在从库通过start slave启动主从复制时出现报错 Last_IO_Error: error connecting to master slaveuser10.115.30.212:3306 - retry-time: 60 retries: 1 message: Authentication plugin caching_sha2_password reported error: Authentication require…...
公众号迁移多久可以完成?
公众号账号迁移的作用是什么?只能变更主体吗?长期以来,由于部分公众号在注册时,主体不准确的历史原因,或者公众号主体发生合并、分立或业务调整等现实状况,在公众号登记主体不能对应实际运营人的情况下&…...
Spring Cloud Stream Kafka(3.2.2版本)使用
问题 正在尝试只用Spring Cloud Stream Kafka。 步骤 配置 spring:cloud:function:definition: project2Building stream:kafka:binder:brokers: xxxx:9002configuration:enable.auto.commit: falsesession.timeout.ms: 30000max.poll.records: 30allow.auto.create.top…...
8位微控制器上的轻量级SM2加密算法实现:C语言详细指南与完整代码解析
引言 在当今的数字化世界中,安全性是每个系统的核心。无论是智能家居、医疗设备还是工业自动化,每个设备都需要确保数据的安全性和完整性。对于许多应用来说,使用高级的微控制器或处理器可能是不切实际的,因为它们可能会增加成本…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
