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

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设计模式,事务管理和代理模式的应用

扩充&#xff1a;贝叶斯定理答案见底。 设计模式对关于面向对象问题的具体解决方案&#xff0e; 1&#xff0c;单例多例 在设计单例模式时&#xff0c;要注意两个点 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安装完&#xff0c;使用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中读取图片&#xff0c;你可以使用第三方库Pillow&#xff08;Python Imaging Library&#xff0c;PIL&#xff09;或OpenCV。以下是使用这两个库的示例&#xff1a; 使用Pillow库读取图片&#xff1a; 首先&#xff0c;确保你已经安装了Pillow库。如果还没有安装&am…...

虚幻4学习笔记(15)读档 和存档 的实现

虚幻4学习笔记 读档存档 B站UP谌嘉诚课程&#xff1a;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库中的主要数据结构&#xff0c;它是一个多维数组&#xff0c;用于存储和操作数值数据。NumPy是Python中用于数值计算的强大库&#xff0c;numpy.ndarray 是它的核心数据类型&#xff0c;提供了高效的数值运算和广泛的数学函数。 以下是 numpy.ndarray 的…...

【二、安装centOS】

下载 地址&#xff1a;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/ 选哪一个 可以选择第一个&#xff0…...

【动手学深度学习-Pytorch版】序列到序列的学习(包含NLP常用的Mask技巧)

序言 这一节是对于“编码器-解码器”模型的实际应用&#xff0c;编码器和解码器架构可以使用长度可变的序列作为输入&#xff0c;并将其转换为固定形状的隐状态&#xff08;编码器实现&#xff09;。本小节将使用“fra-eng”数据集&#xff08;这也是《动手学习深度学习-Pytor…...

AUTOSAR 面试知识回顾

如果答不上来&#xff0c;就讲当时做了什么 1. Ethernet基础: 硬件接口&#xff1a; ECU到PHY&#xff1a; data 是MII总线&#xff0c; 寄存器控制是SMI总线【MDCMDIO两根线, half duplex】PHY输出(100BASE-T1)&#xff1a; MDI总线&#xff0c;2 wire 【T1: twisted 1 pair …...

华为NFC设置教程(门禁卡/公交卡/校园卡等)

今天把华为NFC设置教程分享给大家 出门带门禁卡、校园卡、银行卡、身份证……东西又多&#xff0c;携带又麻烦&#xff0c;还容易搞丢&#xff0c;有没有一种方法可以把它们都装下&#xff1f;有&#xff01;只要一部手机&#xff0c;出门不带卡包&#xff0c;各种证件&#x…...

基于微信小程序的音乐播放器设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…...

如何取消显示Notepad++每行显示的CRLF符号

新电脑中重新安装了Nodepad&#xff0c;打开记事本后发现出现了许多黑底的CR|LF标记&#xff0c;特别碍眼。 如何取消呢&#xff1f; 视图 -> 显示符号 -> 取消勾选 显示行尾符操作步骤 预期效果...

数据结构与算法之时间复杂度和空间复杂度(C语言版)

1. 时间复杂度 1.1 概念 简而言之&#xff0c;算法中的基本操作的执行次数&#xff0c;叫做算法的时间复杂度。也就是说&#xff0c;我这个程序执行了多少次&#xff0c;时间复杂度就是多少。 比如下面这段代码的执行次数&#xff1a; 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: 重用,复用 案例&#xff1a; 第二次访问www.baidu.com 说明&#x…...

C++设计模式_06_Decorator 装饰模式

本篇将会介绍Decorator 装饰模式&#xff0c;它是属于一个新的类别&#xff0c;按照C设计模式_03_模板方法Template Method中介绍的划分为“单一职责”模式。 “单一职责”模式讲的是在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随…...

MySQL 8.0数据库主从搭建和问题处理

错误处理&#xff1a; 在从库通过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…...

公众号迁移多久可以完成?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;长期以来&#xff0c;由于部分公众号在注册时&#xff0c;主体不准确的历史原因&#xff0c;或者公众号主体发生合并、分立或业务调整等现实状况&#xff0c;在公众号登记主体不能对应实际运营人的情况下&…...

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语言详细指南与完整代码解析

引言 在当今的数字化世界中&#xff0c;安全性是每个系统的核心。无论是智能家居、医疗设备还是工业自动化&#xff0c;每个设备都需要确保数据的安全性和完整性。对于许多应用来说&#xff0c;使用高级的微控制器或处理器可能是不切实际的&#xff0c;因为它们可能会增加成本…...

neo4j下载安装配置步骤

目录 一、介绍 简介 Neo4j和JDK版本对应 二、下载 官网下载 直接获取 三、解压缩安装 四、配置环境变量 五、启动测试 一、介绍 简介 Neo4j是一款高性能的图数据库&#xff0c;专门用于存储和处理图形数据。它采用节点、关系和属性的图形结构&#xff0c;非常适用于…...

【机组】计算机系统组成课程笔记 第二章 计算机中的信息表示

2.1 无符号数和有符号数 2.1.1 无符号数 没有符号的数&#xff0c;其实就是非负数。在计算机中用字节码表示&#xff0c;目前最常用的是八位和十六位的。 2.1.2 有符号数 将正负符号数字化&#xff0c;0代表 &#xff0c;1代表 - &#xff0c;并把代表符号的数字放在有效数…...

指针笔试题详解

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.指针题写出下列程序的结…...

MySQL 日志管理、备份与恢复

目录 1 数据备份的重要性 2 MySQL 日志管理 ​3 备份类型 3.1 数据备份的分类 3.2 备份方式比较 3.3 合理值区间 3.4 常见的备份方法 4 MySQL 完全备份与恢复 4.1 MySQL 完全备份 5 mysqldump 备份与恢复 5.1 MySQL 完全恢复 6 MySQL 增量备份与恢复 6.1 MySQL 增量…...

vtk- 数据类型(一) 三角链实例代码

三角链实例代码 #include <iostream> #include <string> #include <regex> #include "tuex.h" #include "vtkCylinderSource.h" #include "vtkPolyDataMapper.h" #include "vtkActor.h" #include "vtkRendere…...

Git大全

目录 一、Git概述 1.1Git简介 1.2Git工作流程图 1.3查看Git的版本 1.4 Git 使用前配置 1.5为常用指令配置别名&#xff08;可选&#xff09; 1.5.1打开用户目录&#xff0c;创建 .bashrc 文件 1.5.2在 .bashrc 文件中输入如下内容&#xff1a; 1.5.3打开gitBash&#xff0c;执行…...

Touch命令使用指南:创建、更新和修改文件时间戳

文章目录 教程&#xff1a;touch命令的使用指南一、介绍1.1 什么是touch命令&#xff1f;1.2 touch命令的作用1.3 touch命令的语法 二、基本用法2.1 创建新文件2.2 更新文件时间戳2.3 创建多个文件2.4 修改文件访问时间2.5 修改文件修改时间2.6 修改文件创建时间 三、高级用法3…...

Windows开启 10 Telnet

在Windows 10中&#xff0c;Telnet客户端默认是不安装的。要在Windows 10上使用Telnet客户端&#xff0c;您需要手动启用它。以下是启用Telnet客户端的步骤&#xff1a; 打开控制面板。您可以通过在开始菜单中搜索"控制面板"来找到它。在控制面板中&#xff0c;选择…...

高教杯数学建模A题程序设计要点与思路

2023 年是我最后一次参加 高教杯大学生数学建模竞赛 以后不会再参加了&#xff08;大四参加意义不太&#xff0c;研究生有研究生的数学建模大赛&#xff09; 很遗憾 由于各种原因 我们没有能够完成赛题2022 年 美赛 2022年 Mathor Cup 2022 年国赛 2022 亚太杯 2023年 美赛 202…...

Spring Boot的新篇章:探索2.0版的创新功能

文章目录 引言1. Spring Boot 2.0的响应式编程2. 自动配置的改进3. Spring Boot 2.0的嵌入式Web服务器4. Spring Boot 2.0的Actuator端点5. Spring Boot 2.0的Spring Data改进6. Spring Boot 2.0的安全性增强7. Spring Boot 2.0的监控和追踪8. Spring Boot 2.0的测试改进结论 &…...

企业网站为什么打不开/seo在线优化技术

一、inner join 内联查询查出满足on条件的两个表的公共交集。使用inner join时 inner可以省略。 select * from Student inner join Score on Student.SNoScore.SNo 二、left join 左外联查询&#xff0c;left outer join的简写。以左边的表为基准与右边的表进行关联&#xf…...

成都网站的建设/线上营销推广方案

容灾备份的等级 容灾备份是通过在异地建立和维护一个备份存储系统&#xff0c;利用地理上的分离来保证系统和数据对灾难性事件的抵御能力。 根据容灾系统对灾难的抵抗程度&#xff0c;可分为数据容灾和应用容灾。数据容灾是指建立一个异地的数据系统&#xff0c;该系统是对本地…...

网站建设v/东莞seo黑帽培训

满意答案你的问题有点难&#xff0c;我从网上查了一下&#xff01;找到了关于fx-82ms变fx-991ms1.首先进入SD模式 2.按1&#xff0c;再按M到不能按为止 3.选第二个 4.按上 5.输入1313131....到不能输入为止 6.按&#xff0c;出现data full&#xff0c;再按 &#xff0c; 7.按0(…...

社交类网站手机模版/软文营销的概念

目录 1、什么是自动化测试 2、自动化测试的发展前景怎么样 3、自动化测试难不难&#xff1f; 4、目前市场上自动化测试岗位的薪资是多少&#xff1f; 5、自动化测试学习方法好渠道 6、自动化测试怎么学&#xff1f; 学习基础知识 选择自动化测试框架 开始编写测试脚本 …...

四川省网站建设/全网推广方案

【简答题】运用PS知识,创作一幅作品。作品主题:黑与白。分别保存为psd和jpg格式提交。【简答题】请同学们以“PS滤镜设计案例”为关键词在网上检索3个滤镜案例,并运用滤镜技术,制作3幅作品。【简答题】提交参赛作品修改3稿【简答题】运用所学的PS知识,实用三种颜色,进行作品创作…...

网站建设技术jsp课程设计/线下推广方式都有哪些

辗转了几个blog&#xff0c;也用了自己域名2年&#xff0c;感觉忙起来&#xff0c;可能没有那么多时间去维护自己的域&#xff1b; 其他地方的blog也不在一块&#xff0c;思虑许久后&#xff0c;来到cnblogs&#xff1b;转载于:https://www.cnblogs.com/jking10/p/3375846.html…...