个人学习笔记( 只是为了存储)

声明式事务管理:

.spring boot中声明式事务的使用

想要在spring boot中使用声明式事务,有两种方式,
一种是在各个service层中添加注
还有一种是使用AOP配置全局的声明式事务管理

先来说第一种,需要用到两个注解就,
一个是@EnableTransactionManagement用来开启注解事务管理,
等同于xml配置方式的 <tx:annotation-driven />,另一个是@Transactional

第一种方式的实现方式: 在启动类加上 s事务开启的注解 ,@trasactional 注解 加载service 层

全局 声明 事务具实现: 使用AOP

1、配置类 configuration 注入 PlatformTransactionManager bean : TransactionInterceptor 、Advisor

TransactionInterceptor 类的介绍 :
1、TransactionManager
platformTransactionManager 继承 TransactionManager
abstrctorplatformTransactionManager

编程式事务管理 : 一般用AOP before 前开始 事务 , after 处理 事务

声明式事务说明:
21 * 1.如果将业务逻辑放到service层面来处理,则能够保证事务安全,即便使用了AOP来切入service方法也能保证事务安全;
22 * 2.如果多个service在controller层做业务逻辑(本身就是错误的),则不能保证事务安全。
23 * 对于2中的情况,应该尽量避免,因为本身就是错误的;
24 * 这种情况在面向切面编程中也有可能碰到,如,因为必要切入点为controller(应尽量避免,原则应切service),切面程序跟controller业务逻辑不同,
25 * service不同,会导致事务混乱;
26 *
27 * 如果出现上述情况,则可以使用编程式事务管理(也就是手动控制事务)
28 * 在controller逻辑开始之前手动开启/获取事务,然后在controller逻辑结束后再根据需要提交或者回滚事务;
29 * 在AOP中也是如此,在before中手动开启/获取事务(这一步是必须的),在after中处理切面逻辑,然后根据需要提交或者回滚事务,如果由于异常需要回滚事务,记得修改返回信息
30 *

事务操作的基本流程: 开启事务 、 执行业务 、 正常则提交 、、 异常则回滚 即是编程 事务管理 spring 有更便捷的方式
Spring 方式:

声明式事务管理: 底层是使用AOP
1、 注解
2、xml

spring 事务管理API :
提供一个接口以及实现类: PlatformTrasactionManager 有多个模板 然后 对应JDBCtemplate 是 DatasourceTrasactionManager

PlatformTrasactionManager 可以对应使用 datasourceTransactionMananger

基于注解式的事务管理 :
1、 启动类 开启注解 @Enableauto
2、 service 层接入 @Trasactional

AOP 大致过程:

1、 类 上 加 @Aspect 和 @componet 两个注解 分别表示切面 和 扫描
2、 定义切点 @pointCut ( 切入点位置 )
3、定义通知

@Transactional注解的本质是通过动态代理

比较正式的做法:

让我们直接使用 PlatformTransactionManager 来实现编程式方法从而实现事务。要开始一个新事务,
你需要有一个带有适当的 transaction 属性的 TransactionDefinition 的实例。这个例子中
,我们使用默认的 transaction 属性简单的创建了 DefaultTransactionDefinition 的一个实例。

当 TransactionDefinition 创建后,你可以通过调用 getTransaction() 方法来开始你的事务,
该方法会返回 TransactionStatus 的一个实例。 TransactionStatus 对象帮助追踪当前的事务状态
,并且最终,如果一切运行顺利,你可以使用 PlatformTransactionManager
的 commit() 方法来提交这个事务,否则的话,你可以使用 rollback() 方法来回滚整个操作。

Controller中就可以使用

boolean result = transactionUtil.transact(s -> testService.doSome(1))来获取事务的执行结果了。

重点类 :

PlatformTransactionManager \ transaction 属性的 TransactionDefinition

Restful 风格下的的各个方法 对应操作 :
默认的HTTP请求方法是GET。
POST请求用于创建资源
PUT请求用于更新现有资源、

HTTP删除请求用于删除现有资源

#{} ${} 的作用主要是
替换预编译语句(PrepareStatement)中的占位符?:

对于 : INSERT INTO user (name) VALUES (#{name}); ==> INSERT INTO user (name) VALUES (?);

${} 符号的作用是直接进行 字符串替换:

对于 : INSERT INTO user (name) VALUES (’${name}’); ==> INSERT INTO user (name) VALUES (‘tianshozhi’);

使用 #{} 可以有效的防止SQL注入,提高系统安全性。

启动类加上 Mapper Scan * 即Dao层的类不需要加 @Mapper
Mapper Scan 注解需要加上 一下 的依赖 :

org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2

mySQL 的时区 问题 解决方案 : 在URL 后面加上 serverTimezone=UTC&characterEncoding=utf-8
或者 直接在CMD 下 修改时区问题

SPring 事务管理 :

PlatformTransactionManager
也可以直接使用org.springframework.transaction.PlatformTransactionManager来管理事
,只需通过bean引用将正在使用的PlatformTransactionManager的实现传递给bean
。然后使用TransactionDefinition和TransactionStatus对象来启动、回滚和提交事务。

dwd_zone_inter_index_rt 暂时找不到

IOC 的反射机制 : 使用的是 反射机制+ 工厂模式

1、通过对象获取类名 配置文件 : properties
2、 根据类名加载该类 创建该类的 实例 调用该对象的方法
3、 通过类名 实例化其他类
4、 通过类名 加载 其他类的构造函数
Constructor<?> cons[]=demo.getConstructors();

per1=(Person)cons[0].newInstance();
per2=(Person)cons[1].newInstance(“Rollen”);
per3=(Person)cons[2].newInstance(20);
per4=(Person)cons[3].newInstance(“Rollen”,20);

5、 通过class 返回其他类的 实现接口 Class<?> intes[]=demo.getInterfaces();
6、获得其他类中的父类 Class<?> temp=demo.getSuperclass();
7、 获取其他类 中的 全部构造方法 Constructor<?>cons[]=demo.getConstructors();
8、…

代理 :
1、 静态代理 需要定义一个接口 或 父类 然后 代理类 和目标类一起实现 这个接口或继承 父类

  详细 : 大概的流程 即,在main 方法内  定义目标类的对象 ,  然后作为参数 传递给代理类的 构造函数  

最后在 代理类中调用目标方法

2、动态代理

1、 JDK 动态代理
2、 CGLIB 动态代理

JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现.
Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的被许多AOP的框架使用,例如Spring AOP和synaop,为他们提供方法的interception(拦截)
Cglib包的底层是通过使用一个小而块的字节码处理框架ASM来转换字节码并生成新的类.不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉.

AOP 使用代理 IOC 使用反射

在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。

参数:
JVM 动态 代理 目标类 必须 实现接口

ClassLoader loader,:指定当前目标对象使用类加载器,获取加载器的方法是固定的 即目标类 的 类加载器
Class<?>[] interfaces,:目标对象实现的接口的类型,使用泛型方式确认类型 即目标类 实现的 接口
InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
即 调用管理器

CGLIB 代理 :
1、 目标类不需要 实现接口
2、 使用 Enhancer (用来创建代理对象) 、 MethodInterceptor ( 用来实现方法的调用) 实现 。 需要注意的是方法的参数 。
3、

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Go语言学习笔记电子版是一本非常实用的学习工具,可以记录我在学习Go语言过程中的各种知识点、代码示例和个人心得体会。 首先,这本笔记的电子版具有便捷的查询和编辑功能。在学习过程中,我们经常会遇到需要查询某个知识点的情况,这时候电子版的笔记就能够派上用场。另外,电子版的笔记还可以随时进行编辑和修改,这样我就能够及时更新我的学习进展和思考。 其次,电子版的笔记还可以方便地进行备份和分享。如果我想要保存我的学习笔记,以备将来查阅或分享给其他人,电子版的笔记可以非常方便地进行备份,只需要简单的一键操作就能够完成。而且,电子版的笔记也可以随时分享给其他人,无论是通过社交媒体、邮件还是云存储平台,都能够轻松地进行分享。 另外,电子版的笔记还具有便携性和可搜索性。相比于传统的纸质笔记本,电子版的笔记可以轻松地存储在手机、平板电脑或电脑中,随时随地进行学习。而且,电子版的笔记还可以进行关键词搜索,这样无论我想要查找某个代码示例还是某个概念解释,都能够快速找到相关内容。 总之,Go语言学习笔记的电子版是一种功能强大、使用方便的学习工具。它不仅能够帮助我记录和整理学习过程中的重点内容,还能够方便地进行备份、分享和查阅,提高我的学习效率和便利性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值