springAOP和spring事务

AOP

1.简介

Aop面向切面编程:在开发中我们不能直接对已经设计好的代码进行修改(开放-封闭原则,对扩展开放,对修改封闭),解耦

AOP的底层实现为动态代理

* Target(目标对象):代理的目标对象
* Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
* Joinpoint(连接点):所谓连接点是指那些可以被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
* Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义
* Advice(通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知
分类:前置通知、后置通知、异常通知、最终通知、环绕通知
* Aspect(切面):是切入点和通知(引介)的结合
* Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织
入,而AspectJ采用编译期织入和类装载期织入

2.快速入门

导入依赖

<!-- aspectj的织入(切点表达式需要用到该jar包) -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version> 1.9.9</version>
</dependency>

创建目标类和目标实现类

创建通知类

将目标类和通知类对象创建权交给spring,在spring配置中加入

<!--目标类交给IOC容器-->
<bean id="demo" class="com.esthome.DemoImp" ></bean>
<!--通知类交给IOC容器-->
<bean id="myAdvice" class="com.esthome.MyAdvice"></bean>

在spring约束中加入aop命名空间

xmlns:aop="http://www.springframework.org/schema/aop"http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd

在spring.xml中配置切面

<aop:config> <!--配置aop--><!--抽取切点名--><aop:pointcut id="myPointcut" expression="execution(public void com.esthome.DemoImp.m())"/><!--引入通知类--><aop:aspect ref="myAdvice"><!--配置目标类的方法执行时,使用通知类的before方法进行前置、后置增强--><aop:before method="before" pointcut-ref="myPointcut"/><aop:after method="before" pointcut-ref="myPointcut"/></aop:aspect>
</aop:config>

3.xml配置介绍

切点表达式

execution([修饰符] 返回值类型 包名.类名.方法名([参数]))

表示要拦截那个方法(全限定方法名)

访问修饰符可以省略

返回值类型、包名、类名、方法名可以使用星号 * 代替,代表任意

包名与类名之间一个点 . 代表当前包下的类,两个点 .. 表示当前包及其子包下的类

参数列表可以使用两个点 .. 表示任意个数,任意类型的参数列表

通知类型

<aop:通知类型 method=“通知类中方法名” pointcut=“切点表达式"></aop:通知类型>
或
<aop:通知类型 method=“通知类中方法名” pointcut-ref=“切点名"></aop:通知类型>

4.用注解代替xml文件

在目标类和通知类加入注解将他们交给spring

并为通知类配置切面

在spring配置文件中加入包扫描和自动代理

<context:component-scan base-package="com.esthome"/> 
<aop:aspectj-autoproxy/>

5.注解详解

切点表达式的抽取

@Component
@Aspect
public class MyAdvice {@Pointcut("execution(* com.easthome..*.*(..))")public void myPoint(){}@Before("MyAdvice.myPoint()")public void before() {System.out.println("前置通知...");}

通知类型

总结

  • 使用@Aspect注解,标注切面类
  • 使用@Before等注解,标注通知方法
  • 使用@Pointcut注解,抽取切点表达式
  • 配置aop自动代理 aop:aspectj-autoproxy

spring的事务

1.spring中事务的控制方式

  • Spring的事务控制可以分为编程式事务控制和声明式事务控制。
  • 编程式
    • 开发者直接把事务的代码和业务代码耦合到一起,在实际开发中不用。
  • 声明式
    • 开发者采用配置的方式来实现的事务控制,业务代码与事务代码实现解耦合,使用的AOP思想。

2.事务管理器

事务有四种状态 :开启、提交、回滚、关闭;

PlatformTransactionManager接口,是事务管理器提供了以下方法可操作事务

PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类。

  • Dao层技术是jdbcTemplate或mybatis时:
    • DataSourceTransactionManager
  • Dao层技术是hibernate时:
    • HibernateTransactionManager
  • Dao层技术是JPA时:
    • JpaTransactionManager

3.事务的信息

  • TransactionDefinition接口提供事务的定义信息(事务隔离级别、事务传播行为等等)提供的方法

事务的隔离级别

  • 设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读(幻读)。

* ISOLATION_DEFAULT 使用数据库默认级别

* ISOLATION_READ_UNCOMMITTED 读未提交

* ISOLATION_READ_COMMITTED 读已提交

* ISOLATION_REPEATABLE_READ 可重复读

* ISOLATION_SERIALIZABLE 串行化

事务传播行为

  • 事务传播行为指的就是当一个业务方法【被】另一个业务方法调用时,应该如何进行事务控制

  • read-only(是否只读):建议查询时设置为只读
  • timeout(超时时间):默认值是-1,没有超时限制。如果有,以秒为单位进行设置

4.事务的状态

  • TransactionStatus 接口提供的是事务具体的运行状态

  • 可以简单的理解三者的关系:事务管理器通过读取事务定义参数进行事务管理,然后会产生一系列的事务状态。

5.总结

  • Spring中的事务控制主要就是通过这三个API实现的
    • PlatformTransactionManager 负责事务的管理,它是个接口,其子类负责具体工作

6.基于XML的声明式事务控制

引入事务依赖

<!--spring 事务管理-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.20</version>
</dependency>

在spring.xml中加入约束

<?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"xmlns:tx="http://www.springframework.org/schema/tx"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.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd">

事务管理器通知配置

<!--事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
<!--事务管理 配置通知类advice-->
<tx:advice id="myadvice" transaction-manager="transactionManager"><!--事物的属性--><tx:attributes><!--匹配所有的方法--><tx:method name="*"/></tx:attributes>
</tx:advice>

配置切面

<!--aop设置切点-->
<aop:config><aop:advisor advice-ref="myadvice" pointcut="execution(public void com.esthome.service.AccountServiceImp.transfer(..))"/>
</aop:config>

<!--增删改查常用配置-->
<tx:attributes><tx:method name="save*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="find*" read-only="true"/><tx:method name="*"/>
</tx:attributes>

7.基于注解的声明式事务控制

在xml配置文件中加入此配置

 <!--事务管理器--><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--事务的注解支持--><tx:annotation-driven/>

在service层的目标类的目标方法加入此注解

@Transactional

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548202.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

专业网站建设必备

专业网站建设不仅仅是简单的页面搭建&#xff0c;更是一项综合性的工程&#xff0c;需要结合行业特性、用户体验和技术创新&#xff0c;打造一个符合企业需求、独具特色的线上空间。 第一印象至关重要 一个企业网站就如同公司的数字名片&#xff0c;第一印象往往决定了用户是否…

衡石分析平台系统管理手册-功能配置之全局 JS 设置

全局 JS 设置​ 衡石系统提供了全局 JS 设置功能&#xff0c;用户可以通过自定义 JS 代码实现系统的个性化需求&#xff0c;如使用第三方统计工具对系统平台的 PV 、UV 进行监测。 使用场景​ 场景1&#xff1a;增加百度统计​ 下图示例中使用 js 代码引用了百度网站统计功…

MQTT.fx 1.7.1使用说明篇(OneNET-MQTT-API调试)

&#xff08;代码完美实现&#xff09;stm32 新版 onenet mqtt物联网(保姆级教程) &#xff08;代码完美实现&#xff09;stm32 新版 onenet mqtt物联网(保姆级教程)https://blog.csdn.net/Wang2869902214/article/details/142501323 MQTT.fx 1.7.1使用教程 下载地址 MQ…

深圳龙链科技:全球区块链开发先锋,领航Web3生态未来

【深圳龙链科技】是全球领先的Web3区块链技术开发公司&#xff0c;专注于为全球客户提供创新高效的区块链解决方案。 深圳龙链科技由币安资深股东携手香港领先的Web3创新枢纽Cyberport联袂打造&#xff0c;立足于香港这一国际金融中心&#xff0c;放眼全球&#xff0c;汇聚了华…

部分监督多器官医学图像分割中的标记与未标记分布对齐|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Labeled-to-unlabeled distribution alignment for partially-supervised multi-organ medical image segmentation 部分监督多器官医学图像分割中的标记与未标记分布对齐 01 文献速递介绍 多器官医学图像分割&#xff08;Mo-MedISeg&#xff09;是医学图像分析…

『功能项目』下载Mongodb【81】

下载网址&#xff1a;Download MongoDB Community Server | MongoDB 点击安装即可 选择Custom 此时安装已经完成 桌面会创建图标 检查是否配置好MongoDB 输入cmd命令行 Windows键 R 打开命令行 输入cmd 复制安装路径 复制data路径 如果输出一大串代码即配置mongdb成功

LeetCode 面试经典150题 172.阶乘后的零

题目&#xff1a;给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 思路&#xff1a; 代码&#xff1a; class Solution {public int trailingZeroes(int n) {return n 0 ? 0 : n / 5 trailingZeroes(n / 5);}…

央企办医布局智慧医康养,环球医疗(2666.HK)让养老有“医”靠

投资传奇查理芒格说&#xff1a;“我给自己设定的目标是追求平常人没有的常识。”只有挖掘出市场潜移默化的趋势&#xff0c;才能抓住投资机遇。 当下&#xff0c;资本市场一个被低估的产业趋势是&#xff0c;医疗健康行业大并购时代悄然开启&#xff0c;头部上市公司对并购产…

【Python快速学习笔记01】下载解释器/环境变量配置/PyCharm下载/第一个代码

目录 1.下载python解释器 2.第一个python程序 3.配置解释器环境变量 4.下载开发工具 PyCharm 4.通过PyCharm编写第一个python程序 1.下载python解释器 官网下载&#xff0c;但是下载太慢了&#xff0c;所以直接百度搜了下载了个 Welcome to Python.org 1.官网下载 2.直…

香港科技大学数据建模MSc(DDM)硕士学位项目25/26招生宣讲会-西安专场

香港科技大学数据建模MSc(DDM)硕士学位项目25/26招生宣讲会-西安专场 &#x1f559;时间&#xff1a;2024 年10 月12日&#xff08;周六&#xff09; 16:00 &#x1f3e0;地点&#xff1a; 西安交大南洋大酒店(交通大学青龙寺店) 行政会议室 &#x1f9d1;‍&#x1f393;嘉宾…

VS code 使用 Jupyter Notebook 时显示 line number

VS code 使用 Jupyter Notebook 时显示 line number 引言正文引言 有些时候,我们在 VS code 中必须要使用 Jupyter Notebook,但是默认情况下,Jupyter Notebook 是不显示 Line number 的,这对于调试工作的定位是不友好的,这里我们将介绍如何让 Jupyter Notebook 显示 Line…

反问面试官:如何实现集群内选主

面试官经常喜欢问什么zookeeper选主原理、什么CAP理论、什么数据一致性。经常都被问烦了&#xff0c;我就想问问面试官&#xff0c;你自己还会实现一个简单的集群内选主呢&#xff1f;估计大部分面试官自己也写不出来。 本篇使用 Java 和 Netty 实现简单的集群选主过程的示例。…

为何上海我店平台 能够三年突破两百亿销售额?

在当前全球经济环境充满挑战&#xff0c;消费者普遍持谨慎态度的背景下&#xff0c;我店——这家总部位于上海的创新企业&#xff0c;却以惊人的速度崛起&#xff0c;成为市场中的一股清流。 自2021年8月成立以来&#xff0c;我店凭借其独特的环保积分系统&#xff0c;在短短两…

日本IT-正社员、契约社员、个人事业主该如何选?

正社員&#xff1a;就是「正规社员」的意思&#xff0c;按照公司的规定而直接雇用&#xff0c;而且没有制定雇用期间&#xff0c;基本上是以终身雇用至退休年龄&#xff08;70岁&#xff09;为前提。而被雇用的一方需要听从公司的业务命令&#xff0c;包括职位或职场的调迁&…

Go语言开发后台框架不能只有CRUD还需有算法集成基础功能-GoFly框架集成了自然语言处理(NLP)分词、关键词提取和情感分析

前言 Go语言开发框架&#xff0c;我们要把Go的优势体现在框架中&#xff0c;不仅CRUD常规操作&#xff0c;还要把常用即有算力自己集成到框架中&#xff0c;而不是去购买第三方提供服务接口。作为开发者可以拓宽自己代码面&#xff0c;获取更多成就感&#xff0c;同时也提供自…

c++反汇编逆向还原——for循环(笔记)

c反汇编逆向还原代码for循环的实现&#xff0c;for循环和while循环在逆向还原的区别 一、汇编 mov &#xff1a;将源操作数复制到目的操作数 lea &#xff1a;与mov类似 mov a&#xff0c;b 表示将b赋值给a 若是 mov a&#xff0c;[b] 这是将b的地址赋值给a&#xff0c;相…

【数据结构中的哈希】

泛黄的春联还残留在墙上.......................................................................................................... 文章目录 前言 一、【哈希结构的介绍】 1.1【哈希结构的概念】 1.2【哈希冲突】 1.3【哈希函数的设计】 1.4【应对哈希冲突的办法】 一、…

MapReduce学习与理解

MapReduce为google分布式三驾马车之一。分别为《The Google File System》、《MapReduce: Simplified Data Processing on Large Clusters》、《Bigtable: A Distributed Storage System for Structured Data》。三遍论文奠定了分布式存储和计算的基础。本篇文章来说说mapreduc…

C语言 15 预处理

C 语言学习已经快要接近尾声了&#xff0c;但是有一个东西迟迟还没有介绍&#xff0c;就是一直在写的&#xff1a; #include <stdio.h>这到底是个什么东西&#xff0c;为什么每次都要加上呢&#xff1f;这里将详细讨论它缘由。 C 语言中带 # 号的指令并不是 C 关键字的…

ASCII Unicode UTF-8 字符集 字符编码

ASCII Unicode UTF-8 字符集 字符编码 基本概念字符字符集字符编码 字符集和字符编码ASCII 字符集Unicode 字符集UTF-8 附录 基本概念 字符集为每个字符分配了一个唯一的编号&#xff0c;通过这个编号就能找到对应的字符。在编码过程中我们经常会使用字符&#xff0c;而使用字…