spring框架AOP(声明式事务控制)

本文内容纲要:

- 1 整合Hibernate事务控制

- 1.1 了解事务

- 1.2 HibenateTemplate

- 1.3 加入jar

- 1.4 测试HibenateTemplate

- 1.4.1dao

- 1.4.2 配置dao

- 2基于aop使用声明式事务控制

- 2.1 什么是aop

- 2.2 aop的原理

- 编写原始类:

- 了解jdk和cglib区别

- AOP联盟

- 增强

- 事务管理器

- 配置增强(实现事务 管理)

1 整合Hibernate事务控制

1.1 了解事务

我们一般说的事务是来源于关系数据库,当有数据持久化需求时一般都需要事务控制。

关系数据库:支持事务控制,mysql数据库存储引擎为InnoDB支持事务,存储引擎为MyIsam不支持事务。

jdbc:支持事务控制,设置CommitAuto(false)

Hibernate:支持事务,使用session.beginTransaction(),再session.getTransaction().commit()提交事务

spring如果控制事务:由于使用hibernate,spring对Hibernate中session进行管理,支持事务。

1.2 HibenateTemplate

spring针对持久层框架提供了模板类封装数据库操作方法:

1、可以简化数据访问的开发

2、支持事务控制,spring对Hibernate中session进行管理

spring提供了很多模板:

1、JdbcTemplate,针对jdbc操作数据库模板,相当于DbUtil

2、HibernateTemplate,针对Hibernate操作数据库模板。

1.3 加入jar

spring-orm-4.2.4.RELEASE.jar:spring针对orm框架整合包

spring-tx-4.2.4.RELEASE.jar:spring提供事务管理的包

spring-jdbc-4.2.4.RELEASE.jar:spring提供jdbc操作方法包,此包为事务控制的基础包

1.4 测试HibenateTemplate

1.4.1dao

dao实现类继承HibenrateDaoSupport(选择hibernate对应版本,一般选第5版)

Image

1.4.2 配置dao

<bean id="customerTestDao" class="cn.itcast.crm.dao.impl.CustomerTestDaoImpl">

运行报错:

'sessionFactory' or 'hibernateTemplate' is required

由于dao继承HibernateDaoSupport运行需要'sessionFactory'或'hibernateTemplate'。

解决:

将'sessionFactory' or 'hibernateTemplate'注入到dao中。

<context:property-placeholder location="classpath:db.properties"/>

<bean id="customerTestDao" class="cn.itcast.crm.dao.impl.CustomerTestDaoImpl">

<property name="hibernateTemplate" ref="hibernateTemplate"/>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">

<property name="sessionFactory" ref="sessionFactory">

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

<property name="driverClass" value="${jdbc.driver}" />

<property name="jdbcUrl" value="${jdbc.url}" />

<property name="user" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

报错:

Unable to locate persister: cn.itcast.crm.domain.CstCustomer

CstCustomer不是一个被hibenate管理的实体类型。

解决:

在创建SessionFacotry时候加载Hibenate 映射文件:

Image

以上是和hibernate框架进行整合,

2基于aop使用声明式事务控制

2.1 什么是aop

当前service开发中问题:

每个需要进行事务控制的service代码中事务控制部分代码重复的代码,将这些事务控制重复的代码抽取出来。

解决方法:

采用spring aop面向切面编程对上边的代码进行抽取

AOP( Aspect Oriented Programing) 面向切面编程。Spring1.2 版本开始支持AOP编程 (面向切面编程 )。

采用aop的方法对类代码切面编程,通过横向抽取方法将service中的事务控制的代码抽取出来。

2.2 aop的原理

aop面向切面编程的原理就是代理:

1、静态代理

采用一些工具类对原来的类生成一个代理类,代理类以.class存在

2、动态代理(重点,spring基于动态代理实现aop)

在运行中,通过反射生成类的代理对象,在代理对象中对原来的对象进行增强。

spring采用动态代理的技术包括:

1、基于接口生成代理对象(重点)

根据接口方法生成代理对象,对原来的代理对象进行增强

使用jdk提供反射实现

2、基于类生成代理对象

根据类生成一个子类(代理对象),在代理对象(子类)中对父类进行增强。

使用CGLib实现

编写原始类:

public interface CustomerServiceAop {

public void insertCustomer(CstCustomer cstCustomer,CstCustomerDetail cstCustomerDetail) ;

}

了解jdk和cglib区别

jdk:基于接口生成代理对象

cglib:基于类生成代理对象

spring底层使用jdk和cglib,如果原始对象实现了一个接口,spring使用jdk,否则 使用cglib生成代理。

AOP联盟

AOP联盟出一套aop的标准。

aop联盟的jar包:Image

aop术语:

Pointcut(切入点):确定在哪个方法上增强,一个类有多个切点

Advice(通知/增强):在切点上进行增强,包括:前置增强、后置增强、抛出异常增强

Target(目标对象):对目标对象进行增强,生成代理对象

Proxy(代理):对目标对象进行增强,生成****代理对象

Weaving(织入):生成代理的时机(过程)

**1、**动态代理织入,在运行期为目标类生成代理对象

2、编译期织入

Aspect(切面): 包括切点和增强,面向哪个切点进行增强(编程)。

AspectJ语法(切点语法):

通过语法配置切入点:

切入点:方法,哪个/此类哪个/些****方法

表达式包括两部分:函数名和操作参数。

例子:execution(* cn.itcast.spring.service.impl.*.*(..)) 匹配cn.itcast.spring.service.impl包下所有类的所有方法(任意形参),任意返回值。

增强

AspectJ支持的增强类型:

n Before 前置增强/通知,相当于BeforeAdvice

n AfterReturning 后置增强/通知,相当于AfterReturningAdvice

n Around 环绕增强/通知,相当于MethodInterceptor

n AfterThrowing抛出增强/通知,相当于ThrowAdvice

After 最终finally增强/通知,不管是否异常,该通知都会执行

下面就开始逐层配置:

dao:

还是用上面写好的继承hibernamteTemplate

service:

Image

Image

事务管理器

在applicatoinContext-transaction.xml

Image

配置增强(实现事务 管理)

加入约束:

<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/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/aop

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

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd">

aop:config

<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.crm.service.impl.*.*(..))"/>

</aop:config>

本文内容总结:1 整合Hibernate事务控制,1.1 了解事务,1.2 HibenateTemplate,1.3 加入jar,1.4 测试HibenateTemplate,1.4.1dao,1.4.2 配置dao,2基于aop使用声明式事务控制,2.1 什么是aop,2.2 aop的原理,编写原始类:,了解jdk和cglib区别,AOP联盟,增强,事务管理器,配置增强(实现事务 管理),

原文链接:https://www.cnblogs.com/jingyukeng/p/10241647.html

以上是 spring框架AOP(声明式事务控制) 的全部内容, 来源链接: utcz.com/z/296654.html

回到顶部