Spring框架3(TX事务管理、TX事务管理属性配置详解、Spring中注解的使用)

2024-03-26 07:50

本文主要是介绍Spring框架3(TX事务管理、TX事务管理属性配置详解、Spring中注解的使用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spring中的TX事务管理

1.TX事务管理介绍

Spring中的内容
IOC:控制反转------帮助我们创建对象和解耦
AOP:面向切面-----提升代码的扩展性和解耦
TX:声明式事务

[1].为什么使用事务

我们在学习mybatis的时候知道,mybatis中的事务是和JDBC中的事务一致的,那么Spring中是如何进行事务管理的呢?

[2]事务管理

事务管理:编程式事务声明式事务
A、编程式事务:整个事务管理都需要程序员手动编写,自己提交或者回滚
B、声明式事务:整个事务管理操作,不需要我们自己书写,现在Spring已经帮我们处理好了,我们自己只需要在代码中声明配置即可。

[3]事务使用的场景

当我们执行的是两条或两条以上的添加、删除、修改的SQL语句时使用

[4]Spring中声明式事务

给方法增加事务,就是给切点增加通知。
切点:需要的方法
通知:事务
织入成切面

[5]使用的时候要注意

我们增加了声明式事务的代码块不可以自己捕获异常,如果自己进行了异常的捕获,spring就没有办法得知此事的异常,这个时候我们配置的声明式事务就不再起作用了。
如果我们就需要书写try catch代码块还要结合声明式事务,这个时候就需要自己手动抛异常。

[6]具体文件配置代码

1.配置xsd约束文件,把圈出的代码复制到指定位置
在这里插入图片描述

	<!-- [1]连接数据库获得数据源  源码在spring-jdbc  jar包下 --><bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/qt3"></property><property name="username" value="root"></property><property name="password" value="1111"></property></bean><!--[2]获得sqlSession工厂对象  源码在mybatis-spring jar包下--><bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="ds"></property><property name="typeAliasesPackage" value="cn.qt.pojo"></property></bean><!--[3]扫描mapper文件 源码在mybatis-spring jar包下--><bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="factory"></property><!--cn.qt.mapper下文件的resultType--><property name="basePackage" value="cn.qt.mapper"></property></bean><!--配置声明式事务 ---><!--声明事务的对象 在Spring-jdbc包下--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--这里ref引用的ds为第1步连接数据库获得的数据源的id--><property name="dataSource" ref="ds"></property></bean><!--配置声明式事务--><tx:advice id="ads" transaction-manager="transactionManager"><tx:attributes><!--限定切点pt2中需要声明事务的方法名,若切点具体到只有一个方法,则无需tx:attributes配置--><!--配置切点pt2中第一个需要声明事务的方法--><tx:method name="login"/><!--配置切点pt2中第一个需要声明事务的方法--><tx:method name="save"/></tx:attributes></tx:advice><!--通过配置切面的方式增加通知--><aop:config><aop:pointcut id="pt2" expression="execution(* cn.qt.service.Impl.AdminServiceImpl.*(..))"/><aop:advisor advice-ref="ads" pointcut-ref="pt2"></aop:advisor></aop:config>

2.Spring中TX事务管理属性配置详解


<tx:advice id="ads" transaction-manager="transactionManager"><tx:attributes ><tx:method name="login" propagation=""   isolation=""/></tx:attributes></tx:advice>
  1. name=""表示切点所在的类中哪些方法需要事务配置。支持通配符,例如name="save* "表示expression的限制路径下,所有以save开头的方法。
  2. readonly=“boolean” :是否是只读事务
    2.1如果为true,告诉数据库此事务为只读事务,数据化优先,会对性能有一定的提升,所以只要是查询方法,建议使用此数据。
    2.2如果为false(默认值),表示需要的提交事务,建议增、删、改
  3. propagation :控制事务传播行为
    3.1当一个具有事务控制的方法被另一个具有事务控制的方法调用后,需要如何管理事务?(新建事务?在事务中执行?把事务挂起?抛异常?)
    3.2 required(默认值):如果当前有事务,在事务中执行。如果当前没有事务,新建一个事务。
    3.3 supports:如果当前有事务,就在事务中执行。如果当前没有事务,就在非事务状态下执行。
    3.4 mandatory:必须在事务内部中执行,如果当前有事务,就在事务中执行,如果没有则报错。
    3.5 requires_new:必须在事务中执行。如果当前没有事务,新建事务。如果当前有事务,把当前事务挂起。
    3.6 not_supported:必须在非事务下进行。如果当前没有事务,则运行。如果当前有事务,把当前事务挂起。
    3.7 never:必须在非事务状态下进行。如果当前没有事务,则正常进行。如果当前有事务,则报错。
    3.8 nested:必须在事务状态下进行。如果没有事务,则创建一个事务。若当前有事务,则创建一个嵌套事务。
  4. isolocation="",事务隔离级别。
    在多线程或并发状态下如何保证访问到的数据是具有完整性的。
    4.1 default:默认值,由数据库自动判断应使用什么隔离级别。
    4.2 read_uncommitted:可以读取未提交的数据。可能出现脏读、不重复读、幻读。效率最高
    4.3 read_committed:只能读取其他事务已经提交的数据。可以防止脏读,可能出现不重复读、幻读。
    4.4 repeatable_read:读取的数据被添加锁,防止其他事务修改此数据。可以防止脏读、不重复读,可能出现幻读。
    4.5 serializable:排队操作,对整个表加锁。一个事务在操作数据时,另一个事务必须等待事务操作完成后才能操作这个表。
    最安全的。效率最低的。
  5. rollback-for=“异常类型全限制路径”:即当出现什么异常时才进行回滚。
    建议:给定该属性值。手动抛异常一定要给该属性值。
  6. no-rollback-for="":出现什么情况时不回滚事务。

3.Spring中注解的使用

[1]Spring中注解使用的例子

我们使用SpringIOC时,创建一个学生对象
Student实体类

public class Student {private String name;private int age;private String sex;Constructor构造方法set and get方法toString方法等
}

xml配置文件

<bean id="student" class="cn.qt.pojo.Student"></bean>

然后通过getBean获得Student对象

 ApplicationContext app=new ClassPathXmlApplicationContext("applicatopnContext.xml");Student stu = app.getBean("stu", Student.class);

但我们使用注解时,代码则为
Student实体类

import org.springframework.stereotype.Component;import javax.annotation.Resource;/* @Component 相当于在配置文件中 <bean id="student" class="cn.qt.pojo.Student"></bean>*/
@Component("stu")
public class Student {private String name;private int age;private String sex;Constructor构造方法set and get方法toString方法等}

xml配置文件

<!--扫描pojo包 (Student对象在此包中) ,而无需使用<bean>标签 --><context:component-scan base-package="cn.qt.pojo"></context:component-scan>

通过getBean获得Student对象相同。
问题:如何给Student对象赋值?如在创建Student时定义name=“张三”?
解决:用 @Resource或@Autowired注解,即在Student实体类中

 @Resourceprivate String name;

由于是给name赋值,则在定义name的语句之上,添加 @Resource注解,然后在xml标签中配置

<!-- class="java.lang.String" 为name属性的类型-->
<bean id="name" class="java.lang.String"><constructor-arg value="张三"></constructor-arg></bean>

@Resource会根据下面属性的名称,去到xml配置文件中找id="name"的< bean/>标签,将其constructor-arg 标签的value赋值给属性。

[2]Spring中常见的注解及其作用
  1. @Component 创建类对象,相当于配置< bean />,bean的ID默认为类名首字母小写,也可以指定其类名,例如@Component(“student”)
  2. @Service ,与@Component功能相同。专门写在ServiceImpl类上(即业务层)。
  3. @Repository 与@Component功能相同。专门写在数据访问层。
  4. @Controller与@Component功能相同。写在控制器类上
  5. @Resource写在属性上,用于给属性注入值(类中不需要写属性的set()/get()方法)。默认按照byName注入,若没有对象名称,也会按照byType注入。建议对象名称和spring中对象名(id)相同。是java中的注解
  6. @Autowired 和@Resource作用相似,但是其默认使用byType注入。是Spring中的注解。
    注意:无论是使用@Resource还是@Autowired,都应保证属性名和xml中< constructor-arg values="">所在的父标签的id保持一致。
  7. @Value("${键名}") 获取properties文件中的内容。
    读取属性文件的标签为 <context:property-placeholder location=“classpath:属性名”></context:property-placeholder>
    注意:以下注解仅针对于Aspect J方式
  8. @Pointcut():定义切点
  9. @Aspect():定义切面类
  10. @Befour():前置通知
  11. @After():后置通知
  12. @AfterReturning:后置通知,你先切点正确进行
  13. @AfterThrowing:异常通知
  14. @Around:环绕通知

注意:使用注解,一定要在配置文件中声明注解扫描。
<context:component-scan base-package=“包名路径”></context:component-scan>
用注解实现AspectJ时,一定要在配置文件中添加

 <!--扫描通知所在的类--><context:component-scan base-package="cn.qt.advice"></context:component-scan>
<!--扫描的是@AspectJ--><aop:aspectj-autoproxy></aop:aspectj-autoproxy>
[3]代码实现使用注解实现AspectJ添加通知

A、实体类

import org.springframework.stereotype.Component;@Component("user")
public class User {public void u(){System.out.println("切点方法UU()");}
}

B、通知类

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component
@Aspect
public class Advice {//前置通知方法@Before("execution(* cn.qt.pojo.User.u())")public void beforeAdv(){System.out.println("前置通知");}//后置通知方法@After("execution(* cn.qt.pojo.User.u())")public void afterAdv(){System.out.println("后置通知");}//环绕通知方法@Around("execution(* cn.qt.pojo.User.u())")public Object aroundAdv(ProceedingJoinPoint point) throws Throwable{System.out.println("环绕通知---前");Object o = point.proceed();System.out.println("环绕通知---后");return o;}//异常通知方法@AfterThrowing("execution(* cn.qt.pojo.User.u())")public void throwAdv(){System.out.println("异常通知");}
}

C、配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--扫描User所在的pojo包--><context:component-scan base-package="cn.qt.pojo"></context:component-scan><!--扫描通知所在的包--><context:component-scan base-package="cn.qt.advice"></context:component-scan><!--扫描的是@AspectJ--><aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

D、测试类

import cn.qt.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext app=new ClassPathXmlApplicationContext("applicatopnContext.xml");User us = app.getBean("user", User.class);us.u();}
}

输出结果
在这里插入图片描述

4.总结

在这里插入图片描述

这篇关于Spring框架3(TX事务管理、TX事务管理属性配置详解、Spring中注解的使用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/847788

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D