栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springAOP面向切面编程以及对事务的支持

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springAOP面向切面编程以及对事务的支持

目录

一、springAOP 面向切面编程

(一)springAOP概念解析

(二)springAOP的XML文件配置

1.入门案例

 2.AOP的工作流程

3.通知类型

 4.切点表达式

5.配置所有通知类型

 

(三)springAOP通过注解去配置

 二、springAOP对事务的支持

(一)事务的简介

1.jdbc中的事务

2.spring中的事务控制

3.spring中事务管理的核心类和方法

(二) 使用xml配置事务

1.使用spring创建一个转账的功能实现

(1)pom.xml依赖

(2)创建一个tx事务管理头的模板

 (3)创建spring核心配置文件

(4)创建业务层

 (5)测试转账的方法

 (6) 为写好的代码添加事务

(三) 使用注解来实现事务(了解)


一、springAOP 面向切面编程

(一)springAOP概念解析

AOP aspect orineted programming 面向切面编程

通过预编译和运行期间的动态代理去实现的程序和功能统一维护的一种技术

AOP是一种编程范式是OOP的延续,是在OOP的基础上对程序进行的一种横向开发

AOP注重的不是每一层如何开发的,而是注重每一层各个模块之间的共性功能

比如要添加的共性功能比如事务、日志、各种统计等。

专业术语解析

连接点 (join point) :程序运行的时间点 ,比如方法执行前,方法执行后,出现异常后。

springAOP join point 是方法的执行点,只有方法才有连接点。

切点(cut point):(要往哪个方法去创建连接点)

aop 提供了一组规则,用这组规则去切(匹配)连接点,匹配出来的就叫切点

springAOP提供了切点表达式来表示这个规则

切点的单位是方法

增强(advice):

就是指具有具体意义的功能,比如事务管理

增强就是在原有代码上要添加的功能

织入(weaving):

这是一个动作,就是将要添加的功能即增强添加到核心代码上的过程。

目标对象(target):

在核心代码织入后产生的的代理对象(就是代理类对象)

切面(ascept):

在AOP中是一个概念,里面包含切点和增强

增强定义切面任务在什么时候执行,切点定义在什么位置切入

也就是说切面定义什么样的增强功能,切入到核心方法的哪个位置

(二)springAOP的XML文件配置

1.入门案例

springAOP底层是通过动态代理和cglib代理来实现的面向切面编程,在正常使用的情况下,spring使用动态代理来实现,如果需要使用cglib代理,需要手动配置。正常情况下,我们需要创建接口。

案例:在原有代码基础上添加日志打印功能。

(1)参加项目,导入依赖


    5.1.5.RELEASE


    
    
        org.springframework
        spring-context
        ${spring-version}
    
    
    
        org.springframework
        spring-test
        ${spring-version}
    
    
    
        org.springframework
        spring-aop
        ${spring-version}
    
    
    
        org.aspectj
        aspectjweaver
        1.9.5
    

(2)使用spring注解创建各种功能

持久层接口:

持久层实现类:

业务层接口:

业务层实现类:

(3)创建spring的核心配置文件

(4)创建web的测试类,运行方法

(5)创建增强类

(6)修改核心配置文件,配置AOP

要添加aop配置,需要添加aop约束:

测试:根据切面将增强添加到原有的方法上了

 2.AOP的工作流程

开发阶段:

正常开发,然后发现共性功能需要添加,开发增强,制作切点,在配置文件中,声明切点和增强之间的关系形成切面

运行阶段:

JVM读取配置文件,监控切点对应的方法执行,一旦方法开始执行,使用代理机制动态创建目标对象

3.通知类型

 

aop中后面添加的内容  在aop中叫通知。

before :前置通知。  在方法前执行的增强。

after-returning 后置通知   在方法的后面执行的增强,如果方法执行的时候有异常,就不会执行。

after-throwing 异常通知   在方法执行出现异常后,添加的增强

after :最终通知    无论方法是否出现异常,都在方法后面添加的增强。

around : 环绕通知     可以在方法的任何时候添加增强

 

 

 4.切点表达式

在配置文件中 使用 expression = 属性  来定义切点表达式。在定义表达式的时候必须要将表达式写在execution()    中

完整的切点表达式

void cn.offcn.service.UserSeriverImpl.addUser()

在切点表达中可以使用模糊匹配来完善表达式:

  * :任意多个字符的匹配

 .   :任意的以及包的路径

 ..  :匹配一级或者多级包的路径

(..)  : 表示入参是任意多个  类型任意

常用匹配任意业务的方法

* cn.offcn.service..*Impl.add*(..)

5.配置所有通知类型

添加通知:

修改配置文件:

在创建一个personService业务逻辑类:

测试:

结果:

如果在方法中添加一个异常:

结果:

 

(三)springAOP通过注解去配置

如果要使用springAOP注解来配置,就需要在spring核心配置文件中修改:

 

 

开发通知:创建一个通知类:

在该类中,使用注解来标明对应的通知类型,以及切点:

对应通知类型的注解来标明:

可以在当前的类中将表达式提取出来:

在当前类中可以使用方法来替代表达式:

测试:

结果:

 

 二、springAOP对事务的支持

(一)事务的简介

1.jdbc中的事务

数据库的事务:

数据库事务就是访问数据库的时候,将各种增删改操作合到一个操作序列,合并成一个事务。当前事务所有的操作,要么都成功,要么都失败,让这个事务形成一个不可分割的整体。在这个事务开始和结束之间的内容都是数据库的操作。

系统中中的事务:

系统的事务是指 处理一系列业务逻辑的执行单元,该单元一系列操作要么都成功要么都失败。

事务的特性:

原子性:事务是不可分割的整体

一致性:事务中所有的操作结果都是一样的(要么都成功要么都失败,这个状态要一致)

隔离性:事务与事务之间是相互隔离的,互不影响(这里是指不影响原子性和一致性)

持久性:事务最终执行的结果影响到数据库,事务的改变是永久性的

2.spring中的事务控制

可以分为两种,编程式事务和声明式事务。spring官方推荐声明式事务。

声明式事务是通过springAOP实现的。

本质上就是利用AOP功能,在要添加事务的模块、方法上、前置添加事务的开启、后置添加事务的提交,异常添加事务的回滚,最终添加事务的关闭

声明式事务的特点:

可以将事务和业务代码完全分离,通过配置的方式实现事务,在开发过程中不用担心事务是怎么设置、配置的。

声明式事务的不足:

只能做到方法级别上的事务管理,无法和编程式事务一样做到代码级别上的事务管理。

3.spring中事务管理的核心类和方法

在spring框架中有一个模块叫spring-tx,专门用来做事务管理的

该jar包下主要的类:

(1)事务管理平台

   不同插件使用的是不同的事务管理平台(要整合不同的插件,需要设置不同的事务管理平台,mybatis和jdbc用的是一个管理平台)

(2)事务的运行状态

TransactionStatus  类  来查看事务状态

查看事务是否是最新的,是否有回滚点,是否是只回滚的事务,可以刷新事务的状态。

(3)TranscationDefintion

  事务的 设置类

可以通过该类为当前的事务做一些设置。

可以设置是否只读、数据库的隔离级别、可以设置事务的传播行为。

(4)事务的传播行为

一个事务碰到另外一个事务会发生什么。

可以设置七个属性

(5)事务的只读模式

只能查看不能修改  属性中有一个read_only

(6)事务的超时设置

timeout  可以设置事务超时时间 。以秒为单位 -1 表示无限制。

(二) 使用xml配置事务

1.使用spring创建一个转账的功能实现

不能使用dbuitls

(1)pom.xml依赖

    5.1.5.RELEASE


    
    
        org.springframework
        spring-context
        ${spring-version}
    
    
    
        org.springframework
        spring-test
        ${spring-version}
    
    
    
        org.springframework
        spring-aop
        ${spring-version}
    
    
    
        org.springframework
        spring-jdbc
        ${spring-version}
    
    
    
        org.springframework
        spring-tx
        ${spring-version}
    
    
    
        org.aspectj
        aspectjweaver
        1.9.5
    
    
    
        mysql
        mysql-connector-java
        5.1.47
    
    
    
        junit
        junit
        4.12
    

(2)创建一个tx事务管理头的模板

 (3)创建spring核心配置文件

(4)创建实体类、持久层

实体类:

持久层接口:

实现类:

创建resultset转化为account的类:

 

(4)创建业务层

接口:

实现类:

 (5)测试转账的方法

结果:

修改业务层,添加错误:

结果:

数据库  没有添加事务 钱总数少了

 (6) 为写好的代码添加事务

在spring核心配置文件中:

测试:

数据库:

在日常配置事务的时候,可以这样来配置:

声明式的事务可以在代码实现前配置,在代码开发的时候只要根据规则来起名字,就可以让该方法添加事务。

(三) 使用注解来实现事务(了解)

修改配置文件:

修改业务层代码:

在需要添加事务的方法上添加注解:

测试:

数据库:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/826374.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号