S详细讲解SH中Spring事务流程

合集下载

Spring声明式事务详解

Spring声明式事务详解

Spring声明式事务详解Spring 中的事务控制⽅式Spring 的事务控制可以分为编程式事务控制和声明式事务控制编程式开发者直接把事务的代码和业务代码耦合到⼀起,在实际开发中不⽤。

声明式开发者采⽤配置的⽅式来实现的事务控制,业务代码与事务代码实现解耦合,使⽤的API思想。

基于XML的声明式事务控制【重点】在 Spring配置⽂件中声明式的处理事来代替代码式的处理事务。

底层采⽤ AOP 思想来实现的。

声明式事务控制明确事项:核⼼业务代码(⽬标对象)事务增强代码{ Spring已提供事务管理器)切⾯配置步骤分析1.引⼊tx 命名空间2.事务管理器通知配置3.事务管理器AOP配置引⼊依赖坐标<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beanshttps:///schema/beans/spring-beans.xsd/schema/contexthttps:///schema/context/spring-context.xsd/schema/aophttps:///schema/aop/spring-aop.xsd/schema/txhttps:///schema/tx/spring-tx.xsd"></beans>基于 XML 的声明式事务的控制配置⽂件<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beanshttps:///schema/beans/spring-beans.xsd/schema/contexthttps:///schema/context/spring-context.xsd/schema/aophttps:///schema/aop/spring-aop.xsd/schema/txhttps:///schema/tx/spring-tx.xsd"><!-- 开启 IOC 注解扫描 --><context:component-scan base-package="inly"/><!-- 引⼊ properties ⽂件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置数据源 --><bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/></bean><!-- jdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!-- 绑定数据源 --><property name="dataSource" ref="datasource"/></bean><!-- 事务管理器对象 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 数据源对象 --><property name="dataSource" ref="datasource"/></bean><!-- 通知增强 transaction-manager: 配置的事务管理器对象 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 定义⼀些事务属性 --><tx:attributes><!-- * 表⽰当前任意名称的⽅法都⾛默认的配置 --><tx:method name="*"/></tx:attributes></tx:advice><!-- AOP 配置切⾯ --><aop:config><!-- 配置声明式式务 --><aop:advisor advice-ref="txAdvice" pointcut="execution(* erServiceImpl.updateUser(..))"/></aop:config></beans>Service 层@Overridepublic void updateUser() {User user = userDao.find(2);user.setName("li3");userDao.updateUser(user);int i = 1 / 0;user.setAge(13);userDao.updateUser(user);System.out.println(user);}事务参数的配置详解<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/> name:切点⽅法等isolation:事务的隔离级别propogation:事务的传播⾏为timeout:超时时间read-only:是否只读常⽤ CURD 配置<tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 定义⼀些事务属性 --><tx:attributes><!-- CRUD 常⽤配置表⽰以update开头的⽅法--><tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/> <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/><tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/> <tx:method name="find" read-only="true"/><!-- * 表⽰当前任意名称的⽅法都⾛默认的配置 --><tx:method name="*"/></tx:attributes></tx:advice>基于注解的声明式事务控制常⽤注解步骤分析修改 Service 层,增加事务注解@Override@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ,readOnly = false,timeout = -1) public void updateUser() {User user = userDao.find(2);user.setName("li3");userDao.updateUser(user);int i = 1 / 0;user.setAge(13);userDao.updateUser(user);System.out.println(user);}修改 Spring 核⼼配置⽂件,开启事务注解⽀持<tx:annotation-driven/>。

spring流程

spring流程

spring流程Spring框架是一个轻量级的开发框架,主要用于构建Java企业级应用程序。

它提供了一套完整的解决方案,使得开发人员可以更加便捷地开发、测试和部署应用程序。

Spring框架的流程主要包括配置、依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及测试等几个步骤。

首先,配置是Spring框架的首要任务。

Spring框架通过XML 或者注解来配置和管理应用程序的各个组件。

配置文件包含了应用程序需要的依赖关系、Bean定义以及其他的配置信息。

接下来,依赖注入是Spring框架的核心特性之一。

它是通过容器将各个组件进行装配的过程。

在Spring框架中,组件之间的依赖关系由容器来管理,开发人员只需要定义好组件的接口和实现,然后在配置文件中声明依赖关系即可。

AOP(面向切面编程)是Spring框架的另一个重要特性。

它允许开发人员通过切面来处理系统中的横切关注点,如事务管理、日志记录等。

借助AOP,开发人员可以更加方便地解耦系统中的不同模块,提高代码的可维护性和可扩展性。

MVC(模型-视图-控制器)是Spring框架的另一大亮点。

它提供了一种灵活而高效的架构模式,可以有效地将应用程序的业务逻辑、数据和显示进行分离。

Spring框架通过DispatcherServlet来处理客户端的请求,并将其分发给相应的控制器进行处理。

控制器通过模型的方式来访问数据,并将结果返回给视图进行展示。

最后,测试是Spring框架中不可或缺的一部分。

Spring框架提供了一套完整的测试框架,使得开发人员可以方便地对应用程序进行单元测试、集成测试以及性能测试。

通过测试,开发人员可以及早地发现和解决问题,提高应用程序的质量和稳定性。

综上所述,Spring框架的流程主要包括配置、依赖注入、AOP、MVC以及测试等几个步骤。

通过这些步骤,开发人员可以更加方便地开发、测试和部署Java企业级应用程序。

Spring框架以其灵活、高效和易用的特性,被广泛应用于Java开发领域。

spring运行流程

spring运行流程

spring运行流程Spring是一个开源的轻量级Java框架,它提供了全面的基础设施支持,使得Java应用的开发变得更加简单和高效。

Spring框架的核心是IoC(控制反转)和AOP(面向切面编程),它们为应用程序的开发提供了强大的支持。

在本文中,我们将深入探讨Spring框架的运行流程,帮助大家更好地理解Spring框架的工作原理。

首先,让我们来了解一下Spring框架的IoC容器。

IoC容器是Spring框架的核心,它负责管理应用程序中的所有对象。

在Spring框架中,所有的对象都由IoC容器来创建和管理,开发人员只需要通过配置文件或注解来描述对象之间的依赖关系,而不需要手动去创建和管理这些对象。

这种将对象的创建和管理交给IoC容器来完成的方式,称为控制反转。

通过IoC容器,Spring框架能够实现松耦合,提高代码的可维护性和可测试性。

接下来,让我们来看一下Spring框架的AOP功能。

AOP是Spring框架的另一个核心功能,它允许开发人员在不改变原有业务逻辑的情况下,通过横切关注点的方式来增强应用程序的功能。

在Spring框架中,AOP通过切面(Aspect)和通知(Advice)来实现。

开发人员可以通过定义切面和通知,将横切关注点的逻辑与业务逻辑分离开来,从而提高代码的重用性和可维护性。

在Spring框架中,Bean是一个非常重要的概念。

Bean是Spring框架中的一个对象,它由IoC容器来创建和管理。

在Spring 框架中,Bean的创建和管理是通过BeanFactory和ApplicationContext来实现的。

BeanFactory是Spring框架的基础设施,它提供了对Bean的创建、配置和管理的基本功能。

而ApplicationContext是BeanFactory的子接口,它提供了更多的高级特性,如国际化、事件传播、Bean的自动装配等。

在Spring框架中,开发人员可以通过配置文件或注解来描述Bean之间的依赖关系,从而实现对象之间的解耦和重用。

spring流程

spring流程

spring流程Spring流程。

Spring框架是一个轻量级的、非侵入式的Java企业应用开发框架,它的核心是IoC(控制反转)和AOP(面向切面编程),提供了一种简单的方式来开发企业级应用程序。

在Spring框架中,流程是非常重要的,它决定了应用程序的运行顺序和数据流向。

本文将详细介绍Spring框架中的流程,包括Bean的生命周期、Spring的初始化和销毁过程、以及Spring中常用的流程控制方式。

首先,我们来看一下Spring中Bean的生命周期。

在Spring框架中,Bean的生命周期包括初始化和销毁两个阶段。

在初始化阶段,Spring容器会根据配置文件或注解来创建Bean实例,并进行依赖注入和属性设置。

然后,Spring容器会调用Bean的初始化方法,进行一些额外的初始化工作。

在销毁阶段,Spring容器会调用Bean的销毁方法,进行一些清理工作,释放资源。

整个Bean的生命周期由Spring容器来管理,开发者只需要关注Bean的业务逻辑即可。

其次,我们来了解一下Spring的初始化和销毁过程。

在Spring框架中,初始化和销毁过程是由Spring容器来管理的。

当Spring容器启动时,它会读取配置文件或扫描注解,创建Bean实例,并进行初始化工作。

在初始化过程中,Spring容器会调用Bean的初始化方法,进行一些额外的初始化工作,比如连接数据库、加载配置文件等。

当Spring容器关闭时,它会调用Bean的销毁方法,进行一些清理工作,释放资源。

整个初始化和销毁过程由Spring容器来管理,开发者只需要关注Bean的业务逻辑即可。

最后,我们来介绍一下Spring中常用的流程控制方式。

在Spring框架中,流程控制是非常重要的,它决定了应用程序的运行顺序和数据流向。

Spring提供了多种流程控制方式,比如条件判断、循环、并发控制等。

开发者可以根据实际需求选择合适的流程控制方式,来实现复杂的业务逻辑。

Spring核心系列之Spring中的事务

Spring核心系列之Spring中的事务

Spring核⼼系列之Spring中的事务Spring核⼼系列之Spring中的事Spring核⼼系列之Spring中的事务Hello,⼤家好,前⾯两篇⽂章给⼤家分享了Spring AOP,今天就趁热打铁,给⼤家分享⼀下,Spring中的事务,事务这个事,其实在国内⼀些⼩公司,⼀般都会忽略的,尤其是很多⽹站,设计不到钱的系统,不会在乎这个东西,事务不回滚造成的结果⽆⾮就是脏数据,脏改等后果。

因为作者以前待过的⼀个房产⽹站,根本就不在乎这个事务,有问题就有问题了,反正⽤户也没充钱在⽹站上。

呵呵。

今天还是和⼤家分享⼀下这个Spring的事务,因为这个东西算是Spring 内部使⽤AOP最好的⼀个体现,体现了AOP思想,OK,⽂章结构:Spring boot 中的事务Spring事务中的事务属性1. Spring boot 中的事务看到Spring boot,很多⼈肯定感觉是被忽悠了,为什么说讲Spring事务,这⼜来Spring boot搞事情。

⽤过Spring boot的⼩伙伴其实都知道,这两个没什么⼤的区别,笔者这⾥使⽤Spring boot来演⽰,完全是为什么了简便。

因为搭⼀个Spring传统的ssm三件套⼯程可能要花费5分钟,⽽搭建⼀个Spring boot的"ssm"⼯程,就是⿏标点⼀点的事。

⽽且开启事务也是⼀个注解的事。

所以,⽼铁们,对不住了,这⼀篇⽤Spring boot和⼤家演⽰Spring的事务,这⾥我给⼀个传送门,是传统项⽬的事务,⼤家可以参考下:传统Spring⼯程的Spring事务废话不多说,直接上Spring boot代码:.@EnableTransactionManagement 表⽰开启事务!.这是⼀个Service,内部的personMapper是⼀个dao接⼝,持久化⽤的mybatis.演⽰的效果应该是:当调⽤PersonService的testTx()时,由于开启了事务,所以update2报异常时,应该会回滚。

spring工作流程

spring工作流程

spring工作流程Spring工作流程。

Spring是一个开源的轻量级Java开发框架,它提供了一种全面的编程和配置模型,用于构建现代化的基于Java的企业应用程序。

Spring框架的核心是IoC(控制反转)和AOP(面向切面编程),它还包括许多其他功能,如事务管理、数据访问、Web开发等。

在本文中,我们将重点介绍Spring框架的工作流程,以帮助读者更好地理解Spring框架的运行机制。

1. 初始化Spring容器。

Spring框架的工作流程始于初始化Spring容器。

Spring容器是Spring框架的核心部分,它负责管理应用程序中的对象(bean)以及它们之间的依赖关系。

Spring容器有两种类型,BeanFactory和ApplicationContext。

BeanFactory是Spring框架的基础设施,它提供了基本的依赖注入功能。

ApplicationContext构建在BeanFactory之上,提供了更多的企业级功能,如国际化、事件传播、资源加载等。

2. 加载配置文件。

在初始化Spring容器之前,我们需要先创建一个配置文件,用来描述应用程序中的对象及其依赖关系。

Spring框架支持多种配置方式,包括XML配置、注解配置和Java配置。

XML配置是Spring 框架最传统的配置方式,它通过一个XML文件描述应用程序中的对象及其依赖关系。

注解配置是一种基于注解的配置方式,它通过在Java类上添加注解来描述对象及其依赖关系。

Java配置是一种基于Java的配置方式,它通过Java代码来描述对象及其依赖关系。

3. 实例化对象。

一旦Spring容器被初始化并且配置文件被加载,Spring框架就会根据配置文件中的描述来实例化对象。

Spring框架中的对象通常被称为bean,它们由Spring容器负责管理和创建。

在实例化对象的过程中,Spring框架会根据配置文件中的描述来创建对象,并且解决对象之间的依赖关系。

spring事务详解(基于注解和声明的两种实现方式)

spring事务详解(基于注解和声明的两种实现方式)

spring事务详解(基于注解和声明的两种实现⽅式)Spring事务( Transaction )事务的概念事务是⼀些sql语句的集合,作为⼀个整体执⾏,⼀起成功或者⼀起失败。

使⽤事务的时机⼀个操作需要多天sql语句⼀起完成才能成功程序中事务在哪⾥说明加在业务类的⽅法上⾯(public⽅法上⾯),表⽰业务⽅法执⾏时,需要事务的⽀持。

不同的事务管理器不同的数据库访问技术,处理事务是不同的1. 使⽤jdbc访问数据库,事务处理public void updateAccount(){Connection con = .....;con.setAutoCommit(false);state.insert();state.update();mit();con.setAutoCommit(true);}2. MyBatis执⾏数据库,处理事务public void updateAccount(){SqlSession sqlSession = SqlSessionFactory.openSession(false);try{sqlSession.insert(...);sqlSession.update(...);mit();}catch(Exception e){sqlSession.rollback();}}spring统⼀管理事务,把不同的数据库访问技术的事务处理统⼀起来使⽤spring的事务管理器,管理不同数据库访问技术的事务处理。

开发⼈员只需要掌握spring的事务处理⼀个⽅案,就可以实现使⽤不同数据库访问技术的事务管理。

尽管事务⾯向的是spring,有spring管理事务,做事务提交和回滚。

spring事务管理器spring框架使⽤事务管理器对象,管理所有的事务。

事务管理器接⼝: PlatFormTransactionManager作⽤:定义了事务的操作,主要是commit() , rollback()事务管理器有很多的实现类:⼀种数据库访问计数有⼀个实现类。

Spring中的事务管理实例详解

Spring中的事务管理实例详解

Spring中的事务管理实例详解本文实例讲述了Spring中的事务管理。

分享给大家供大家参考。

具体分析如下:事务简介:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性事务就是一系列的动作,它们被当作一个单独的工作单元。

这些动作要么全部完成,要么全部不起作用事务的四个关键属性(ACID)①原子性(atomicity):事务室一个原子操作,有一系列动作组成。

事务的原子性确保动作要么全部完成,要么完全不起作用②一致性(consistency):一旦所有事务动作完成,事务就被提交。

数据和资源就处于一种满足业务规则的一致性状态中③隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏④持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。

通常情况下,事务的结果被写到持久化存储器中Spring中的事务管理作为企业级应用程序框架,Spring在不同的事务管理API之上定义了一个抽象层。

而应用程序开发人员不必了解底层的事务管理API,就可以使用Spring的事务管理机制。

Spring既支持编程式事务管理,也支持声明式的事务管理编程式事务管理:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式事务中,必须在每个业务操作中包含额外的事务管理代码声明式事务管理:大多数情况下比编程式事务管理更好用。

它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。

事务管理作为一种横切关注点,可以通过AOP方法模块化。

Spring通过Spring AOP框架支持声明式事务管理。

Spring事务的传播属性:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。

例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。

事务的传播行为可以由传播属性指定。

Spring定义了7种传播行为:Spring支持的事务传播行为传播行为含义PROPAGATION_MANDATORY 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常PROPAGATION_NESTED 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。

Spring事务概念跟配置详解(叮嘣)新

Spring事务概念跟配置详解(叮嘣)新

[转载] Java事务处理总结2008年07月23日星期三12:49一、什么是Java事务通常的观念认为,事务仅与数据库相关。

事务必须服从ISO/IEC所制定的ACID原则。

ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。

事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。

一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。

隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。

持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。

通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。

更简答的说就是:要么全部执行成功,要么撤销不执行。

既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系?实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。

增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。

因此,数据库操作的事务习惯上就称为Java事务。

二、为什么需要事务事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。

具一个简单例子:比如银行转帐业务,账户A要将自己账户上的1000元转到B账户下面,A账户余额首先要减去1000元,然后B账户要增加1000元。

假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失败,那么整个业务失败,必须做出控制,要求A账户转帐业务撤销。

这才能保证业务的正确性,完成这个操走就需要事务,将A账户资金减少和B账户资金增加方到一个事务里面,要么全部执行成功,要么操作全部撤销,这样就保持了数据的安全性。

三、Java事务的类型Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。

spring的流程与原理

spring的流程与原理

spring的流程与原理小伙伴们!今天咱们来唠唠Spring这个超酷的框架。

Spring就像是一个超级贴心的大管家,管理着Java应用里的各种对象。

咱先说说它的启动流程吧。

当一个基于Spring的应用启动的时候啊,就像是一场盛大的派对要开场啦。

Spring要做的第一件事就是去寻找配置信息。

这个配置信息呢,就像是派对的策划书,它告诉Spring哪些类要被管理起来,哪些对象之间有什么关系。

这个配置可以是传统的XML文件,也像现在流行的用Java代码写的配置类。

要是XML文件的话,Spring就像一个细心的寻宝者,在文件里找那些关于类的定义、bean的声明之类的宝藏。

如果是Java配置类呢,Spring就会去解析这个类里的各种注解和方法。

找到配置之后呢,Spring就开始创建对象啦。

这可有意思啦,它就像一个神奇的魔法师,根据配置信息把一个个类变成实实在在的对象,这些对象在Spring里被叫做bean。

比如说,你有一个User类,Spring就会按照规则创建出一个User类的实例。

而且啊,Spring创建对象的时候不是随随便便的哦。

如果一个对象依赖于其他对象,就像一个厨师依赖锅碗瓢盆才能做菜一样,Spring会把这些依赖关系处理得妥妥当当。

它会先确保依赖的对象已经被创建好了,然后再把这个对象需要的依赖注入进去。

这个注入的过程就像是给厨师递上他需要的工具,特别巧妙。

Spring的原理里有一个很重要的部分就是IOC(控制反转)。

这是啥意思呢?以前啊,在没有Spring的时候,对象都是自己在代码里去创建自己依赖的对象,就像一个人凡事都要亲力亲为。

但是有了Spring的IOC呢,就反过来啦。

对象不再自己去创建依赖对象,而是由Spring来负责管理和注入这些依赖。

这就好比你本来要自己去超市买菜做饭,现在有个专人给你把菜买好送到你面前,你只要做菜就好啦。

这样做有啥好处呢?最大的好处就是代码的耦合性降低了。

比如说,你要换一个数据库连接对象,要是没有IOC,那你可能要在好多代码里去修改创建这个对象的地方。

spring的使用流程

spring的使用流程

Spring的使用流程1. 概述Spring是一个开源的Java开发框架,它为Java应用程序提供了便捷的开发方式和高度灵活的配置管理。

使用Spring可以实现Java应用程序的解耦、模块化和易于测试等优点。

2. Spring的核心概念在使用Spring之前,首先需要了解一些Spring的核心概念:•依赖注入(Dependency Injection):通过依赖注入,Spring能够自动将需要的对象注入到需要使用它们的地方,从而减少了开发者的工作量和代码的耦合度。

•控制反转(Inversion of Control):Spring使用控制反转的方式实现依赖注入,即控制权由框架来掌控,而不是由开发者来控制。

•面向切面编程(Aspect-oriented Programming):Spring提供了面向切面编程的支持,可以在不改变原有业务逻辑的情况下,添加额外的功能。

3. Spring的使用流程下面是使用Spring的一般流程:步骤1:配置Spring环境在使用Spring之前,需要先配置好Spring的环境。

配置Spring的环境主要包括以下几个方面:•下载和安装Java开发工具(JDK);•下载Spring的核心框架(Spring Framework);•配置开发环境,例如通过配置Java的CLASSPATH环境变量等。

步骤2:定义Spring的配置文件Spring的配置文件一般使用XML格式编写,文件名通常为applicationContext.xml。

在配置文件中,可以定义Spring容器中需要管理的Bean对象、依赖关系以及其他配置信息。

以下是一个简单的applicationContext.xml配置文件的示例:```xml <beans xmlns=。

spring执行流程

spring执行流程

spring执行流程Spring执行流程可以分为四个步骤:配置阶段、实例化阶段、初始化阶段和使用阶段。

配置阶段:在配置阶段,Spring框架会读取并解析XML配置文件,或者通过Java注解配置,来获取应用程序的配置信息。

配置信息包括对象的定义、对象之间的关系以及被注入的属性等等。

Spring提供了许多个性化的配置选项,以及方便的注解方式,可以根据具体的需求灵活配置。

实例化阶段:在实例化阶段,Spring框架会根据配置文件中的定义,通过反射机制或者工厂方法来创建相应的对象实例。

Spring支持不同的实例化方式,包括单例模式、原型模式、会话模式、请求模式等等。

在实例化过程中,Spring会自动解析对象之间的依赖关系,并进行相应的注入。

通过依赖注入,可以使对象之间的解耦,提高代码的可维护性和可测试性。

初始化阶段:在初始化阶段,Spring框架会自动调用对象的初始化方法,以及执行一些额外的操作,如属性的赋值和事件的处理等。

在对象初始化的过程中,可以通过自定义的初始化方法来完成一些特殊的操作,如数据库连接的初始化、数据的加载等。

同时,Spring还提供了一些AOP(面向切面编程)的支持,可以在此阶段进行一些切面的处理,如日志记录、事务管理等。

使用阶段:在使用阶段,Spring框架会将已经初始化的对象注入到相应的调用者中,以供应用程序进行使用。

通过依赖注入,可以避免硬编码,动态地替换对象的实现,提高系统的灵活性和扩展性。

在使用阶段,Spring还提供了一些辅助工具,如AOP代理、数据库事务等,来帮助开发者更加方便地进行开发。

同时,Spring还提供了一些集成的支持,如与Web容器的集成、与数据源的集成等,可以帮助用户快速进行应用开发。

总结:Spring框架的执行流程可以描述为:配置阶段、实例化阶段、初始化阶段和使用阶段。

在配置阶段,Spring框架解析应用程序的配置信息;在实例化阶段,Spring框架创建对象的实例,并进行依赖注入;在初始化阶段,Spring框架调用对象的初始化方法,执行一些额外的操作;在使用阶段,Spring框架将对象注入到相应的调用者中,以供应用程序使用。

流程管理S详细讲解SH中S事务流程

流程管理S详细讲解SH中S事务流程

(流程管理)S详细讲解SH中S事务流程给你详细讲壹下SSH框架的事物管理,希望对你有帮助。

Struts+hibernate+spring整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring的配置做壹下剖析,壹边和大家壹起分享经验:1、准备工作:能够利用hibernatetools生成关联映射文件已经po对象、dao对象,dao也能够自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则能够更轻松的实现关键就于于配置文件,下面见壹个样例app.xml:<?xmlversion="1.0"encoding="utf-8"?><beansxmlns="http:///schema/beans"xmlns:xsi="http:///2001/XMLSchema-instance"xsi:schemaLocation="http:///schema/beanshttp:///schema/beans/spring -beans.xsd"><!--配置数据源--><beanid="dataSource"class="boPooledData Source"destroy-method="close"><!--指定连接数据库的驱动--><propertyname="driverClass"value="com.mysql.jdbc.Driver"/><!--指定连接数据库的URL--><propertyname="jdbcUrl"value="jdbc:mysql://localhost/auction"/><!--指定连接数据库的用户名--><propertyname="user"value="root"/><!--指定连接数据库的密码--><propertyname="password"value="root"/><!--指定连接数据库连接池的最大连接数--><propertyname="maxPoolSize"value="20"/><!--指定连接数据库连接池的最小连接数--><propertyname="minPoolSize"value="1"/><!--指定连接数据库连接池的初始化连接数--><propertyname="initialPoolSize"value="1"/><!--指定连接数据库连接池的连接的最大空闲时间--><propertyname="maxIdleTime"value="20"/></bean><!--配置数据库会话工厂--><beanid="sessionFactory"class="org.springframework.orm.hibernate3.L ocalSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><propertyname="mappingResources"><list><value>com/ouya/User.hbm.xml</value></list></property><propertyname="hibernateProperties"><props><propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</pro p><propkey="hibernate.show_sql">true</prop><propkey="e_reflection_optimizer">true</prop></props></property></bean><!--配置事务管理器--><beanid="transactionManager"class="org.springframework.orm.hiberna te3.HibernateTransactionManager"><propertyname="sessionFactory"><reflocal="sessionFactory"/></prope rty></bean><!—-配置Spring事务管理器代理--><beanid="transactionProxyFactory"abstract="true"lazy-init="true"class= "org.springframework.transaction.interceptor.TransactionProxyFactoryBe an"><propertyname="transactionManager"><reflocal="transactionManager"/></property><propertyname="transactionAttributes"><props><propkey="save*">PROPAGATION_REQUIRED</prop><propkey="insert*">PROPAGATION_REQUIRED</prop><propkey="del*">PROPAGATION_REQUIRED</prop><propkey="add*">PROPAGATION_REQUIRED</prop><propkey="update*">PROPAGATION_REQUIRED</prop><propkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><propkey="list*">PROPAGATION_REQUIRED,readOnly</prop><propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><propkey="get*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean><!--Hibernate模板--><beanid="hibernateTemplate"class="org.springframework.orm.hibernat e3.HibernateTemplate"><propertyname="sessionFactory"><reflocal="sessionFactory"/></property></bean><!--服务层对象--><beanid="us"class="erService"><propertyname="userDao"><reflocal="userDao"/></property></bean><!--spring代理用户服务对象--><beanid="userService"parent="transactionProxyFactory"><!--如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass为true,否则会报classcast异常--><!--<propertyname="proxyTargetClass"value="true"/>--><propertyname="target"ref="us"/></bean><!--用户数据访问对象DATAACCESSOBJECT--><beanid="userDao"class="erDAO"><propertyname="hibernateTemplate"ref="hibernateTemplate"/></bean></beans>能够见到配置文件的步骤:1、配置数据源2、配置会话工厂(依赖注入上面的数据源,仍要注入hbm映射文件[注意正确的位置]、hibernate属性文件)3、配置事务管理器(依赖注入上面的会话工厂)4、Spring中声明事务管理器(根据需要又可分为几种,但均要依赖注入上面的事务管理器,此外仍需要配置transationAttributes)后面的壹些普通的bean配置就不用说了上面的例子中使用的声明事务管理器是:TransactionProxyFactoryBean,这样的话我们就需要于后面配置目标bean,比如上面的例子中我们的原服务对象是id 为us的UserService(没有实现接口),所以我们为他配置了id为userService 的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据库操作功能(代理对象的父类是上面声明的事务管理器,壹边我们使用的时候开启事务),如果直接使用服务对象就无法开启事务程序中调用:UserServiceus=(UserService)app.getBean("userService"); 注:userService就是上面配置的代理对象的id,而不是原服务对象的id可是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的配置文件需要做改动,做俩件事(当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的):1、增加壹个事务拦截器<beanid="transactionInterceptor"class="org.springframework.transactio n.interceptor.TransactionInterceptor"><propertyname="transactionManager"><reflocal="transactionManager"/></property><propertyname="transactionAttributes"><props><propkey="save*">PROPAGATION_REQUIRED</prop><propkey="insert*">PROPAGATION_REQUIRED</prop><propkey="del*">PROPAGATION_REQUIRED</prop><propkey="add*">PROPAGATION_REQUIRED</prop><propkey="update*">PROPAGATION_REQUIRED</prop><propkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><propkey="list*">PROPAGATION_REQUIRED,readOnly</prop><propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><propkey="get*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean>2、定义自动代理事务管理器<!--定义BeanNameAutoProxyCreator--><beanclass="org.springframework.aop.framework.autoproxy.BeanName AutoProxyCreator"><!--如果服务层对象是接口实现类,则需要设置proxyTargetClass属性为true--><!--<propertyname="proxyTargetClass"value="true"--><!--指定对满足哪些beanname的bean自动生成业务代理--><propertyname="beanNames"><!--下面是所有需要自动创建事务代理的bean--><list><value>us</value></list><!--此处可增加其他需要自动创建事务代理的bean--></property><!--下面定义BeanNameAutoProxyCreator所需的事务拦截器--><propertyname="interceptorNames"><list><!--此处可增加其他新的Interceptor--><value>transactionInterceptor</value></list></property></bean>然后我们于程序中调用时应如下:UserServiceus=(UserService)app.getBean("us");注:注意和上面使用TransactionProxyFactoryBean时的调用区别,此处我们用getbean时直接取原服务层对象的id,不需要去配置目标bea,这也正是BeanNameAutoProxyCreator(根据bean名称自动代理)的含义所于附录:1、关于hibernate的属性详解:<beanid="dataSource"class="boPooledData Source"destroy-method="close"><!--以下配置均是使用jdbc.properties属性文件中的配置,而之所以能够这样写,就是因为有属性占位符配置的原因--><propertyname="driverClass"value="${jdbc.driverClassName}"/><propertyname="jdbcUrl"value="${jdbc.url}"/><propertyname="user"value="${ername}"/><propertyname="password"value="${jdbc.password}"/><!--连接池维持的最小的连接个数--><propertyname="minPoolSize"value="5"/><!--连接池维持的最大的连接个数--><propertyname="maxPoolSize"value="20"/><!--最大空闲时间,当某个连接于这个时间内没活动后将从池中移除,前提是池中至少多于最少的连接数:minPoolSize--><propertyname="maxIdleTime"value="1800"/><!--为加强准备语句的执行性能,此参数指定被缓存的PreparedStatement的个数--><propertyname="maxStatements"value="50"/></bean>Hibernate会话厂SessionFactorySession就是用于每次和数据库会话的,因此需要:数据库的配置参数,这些参数就是上面的数据源指定的!因此我们只需引用即可:ref="dataSource";实体映射配置hibernate.cfg.xml配置结果缓存配置(这里使用的是开源的ehcache)<!--HibernateSessionFactory--><beanid="sessionFactory"class="org.springframework.orm.hibernate3.L ocalSessionFactoryBean"><!--引用前面定义的数据源--><propertyname="dataSource"ref="dataSource"/><!--所有实体映射文件列表,所有的hbm.xml文件--><propertyname="mappingResources"><list><value>org/springframework/samples/jpetstore/domain/Account.hbm.x ml</value><value>org/springframework/samples/jpetstore/domain/Banner.hbm.x ml</value><value>org/springframework/samples/jpetstore/domain/Category.hbm. xml</value><value>org/springframework/samples/jpetstore/domain/Inventory.hbm. xml</value><value>org/springframework/samples/jpetstore/domain/Item.hbm.xml </value><value>org/springframework/samples/jpetstore/domain/LineItem.hbm. xml</value><value>org/springframework/samples/jpetstore/domain/Order.hbm.xml </value><value>org/springframework/samples/jpetstore/domain/Product.hbm.x ml</value><value>org/springframework/samples/jpetstore/domain/Supplier.hbm.x ml</value></list></property><!--传统上的hibernate.cfg.xml文件的参数放于这里--><propertyname="hibernateProperties"><props><!--指定数据库方言--><propkey="hibernate.dialect">${hibernate.dialect}</prop><!--是否于日志中输出所有Hibernate和数据库交互的SQL语句--><propkey="hibernate.show_sql">true</prop><!--是否于日志中输出的SQL语句格式化成易读形式--><propkey="hibernate.format_sql">true</prop><!--是否显示统计形式,壹般于测试阶段使用--><propkey="hibernate.generate_statistics">true</prop><!--对于级联查询,壹次性获取的级联深度,@todo需进壹步研究--><propkey="hibernate.max_fetch_depth">2</prop><!--FetchSize是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,壹般设置为30、50、100。

Spring使用注解对事务控制详解与实例

Spring使用注解对事务控制详解与实例

Spring使⽤注解对事务控制详解与实例1.什么是事务⼀荣俱荣,⼀损俱损,很多复杂的操作我们可以把它看成是⼀个整体,要么同时成功,要么同时失败。

事务的四个特征ACID:原⼦性(Atomic):表⽰组成⼀个事务的多个数据库的操作的不可分割的单元,只有所有的操作成功才算成功,整个事务提交,其中任何⼀个操作失败了都是导致整个所有操作失败,事务会回滚。

⼀致性(Consistentcy):事务操作成功后,数据库所处的状态和业务规则⼀致。

如果A账户给B账户汇100,A账户减去100,B加上100,两个账户的总额是不变的。

隔离性(islation):在多个数据库的操作相同的数据并发时,不同的事务有⾃⼰的数据空间,事务与事务之间不受⼲扰(不是绝对的)。

⼲扰程度受数据库或者操作事务的隔离级别来决定,隔离级别越⾼,⼲扰就越低,数据的⼀致性越好,并发性就越差。

持久性(Druability):⼀旦事务提交成功,数据就被持久化到数据库,不可以回滚。

2.spring使⽤注解对事务的控制 Spring 事务管理有两种⽅式:编程式事务管理、声明式事务管理 编程式事务管理通过TransactionTemplate⼿动管理事务,在实际应⽤中很少使⽤,我们来重点学习声明式事务管理 声明式事务管理有三种实现⽅式:基于TransactionProxyFactoryBean的⽅式、基于AspectJ的XML⽅式、基于注解的⽅式 1. 新建⼀个java⼯程——导⼊spring 和事务管理所需要的jar ——然后选择全部jar 右键Build path ——最后如图(我的java版本jre是1.8)2.在src⽬录下新建5个包如图 dao :数据连接层,主要⽤于存放对数据进⾏操作的类 model:模型层,主要⽤于存放实体类 service:服务层,主要⽤于对数据连接层进⾏操作的⼀些服务类。

util:⼯具类,主要⽤于存储⼯具⽅法 test:⽤于测试类3.在dao数据连接层,建⽴⾥与数据库操作的类与对应的接⼝(Order 订单,detail订单明细) 3.1 定义detailDao接⼝ 代码如下:1package com.spring.dao;23import com.spring.model.Detail;4import com.spring.model.Order;56public interface detailDao {7//保存订单明细8public void saveDetail(Detail detail);9101112 } 3.2 定义OrderDao接⼝代码如下:1package com.spring.dao;23import com.spring.model.Order;45public interface OrderDao {6//保存订单7public void saveOrder(Order order);891011 } 3.3 实现以上接⼝detailDaoImp 代码如下:1package com.spring.dao;23import javax.sql.DataSource;45import org.springframework.jdbc.core.JdbcTemplate;67import com.spring.model.Detail;8import com.spring.model.Order;910public class detailDaoImp implements detailDao {1112private DataSource dataSource;13private JdbcTemplate jdbcTemplate;1415public void setDataSource(DataSource dataSource) {16this.dataSource = dataSource;17this.jdbcTemplate = new JdbcTemplate(dataSource);18 }19//保存订单明细20public void saveDetail(Detail detail) {21 String SQL = "insert into t_detail values(null,?,?,?))";22 jdbcTemplate.update(SQL, new Object[] { detail.getItemName(),detail.getQuantity(),detail.getOrderId() });23 System.out.println("Insert detail success!");24 }2526 }OrderDaoImp代码如下:package com.spring.dao;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;import com.spring.model.Order;public class OrderDaoImp implements OrderDao {private DataSource dataSource;private JdbcTemplate jdbcTemplate;public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;this.jdbcTemplate = new JdbcTemplate(dataSource);}//插⼊订单public void saveOrder(Order order) {String SQL = "insert into t_order values (null,?)";System.out.println(SQL);System.out.println(order.getTotal_price());jdbcTemplate.update(SQL, new Object[]{order.getTotal_price()});System.out.println("Insert order success!");}}4.在model层中新建两个实体类 (Order订单类,detail订单明细类) Order订单类代码如下:1package com.spring.model;23/*4 * 订单表5*/6public class Order {7//订单编号8private Integer order_id;9//订单总⾦额10private Integer total_price;11public Integer getOrder_id() {12return order_id;13 }14public void setOrder_id(Integer order_id) {15this.order_id = order_id;16 }17public Integer getTotal_price() {18return total_price;19 }20public void setTotal_price(Integer total_price) {21this.total_price = total_price;22 }23 } detail订单明细类代码如下:1package com.spring.model;23/**4 * 商品明细表5 * @author Administrator6 *7*/8public class Detail {9//ID10private Integer detailId;11//外键 暂时可以忽略12private Integer orderId;13public Integer getDetailId() {14return detailId;15 }16public void setDetailId(Integer detailId) {17this.detailId = detailId;18 }19public Integer getOrderId() {20return orderId;21 }22public void setOrderId(Integer orderId) {23this.orderId = orderId;24 }25public Integer getQuantity() {26return quantity;27 }28public void setQuantity(Integer quantity) {29this.quantity = quantity;30 }31public String getItemName() {32return itemName;33 }34public void setItemName(String itemName) {35this.itemName = itemName;36 }37//商品数量38private Integer quantity;39//商品数量40private String itemName;4142 }5.在service中定义⼀个接⼝并且实现它 OrderService代码如下:1package com.spring.service;3import com.spring.model.Detail;4import com.spring.model.Order;56public interface OrderService {7//插⼊订单和订单明细8public void saveOrderAndDetail(Order order,Detail detail);9 } OrderServiceImp代码如下:1package com.spring.service;23import org.springframework.transaction.annotation.Transactional;45import com.spring.dao.OrderDaoImp;6import com.spring.dao.detailDaoImp;7import com.spring.model.Detail;8import com.spring.model.Order;910/**11 * 服务层使⽤注解来实现事务管理12 *13 * @author Administrator14 *15*/1617public class OrderServiceImp implements OrderService {18// 注⼊两个对象19public OrderDaoImp OrderDaoImp;2021public detailDaoImp detailDaoImp;2223 @Transactional24 @Override25// 如果加上@Transaction时,⽅法执⾏有异常,整个事务数据都会回滚,数据库中不会存在有数据。

spring事务管理全解析

spring事务管理全解析

spring事务管理全解析事务是一组原子(Atomic)操作的工作单元,以数据库存取的实例来说,就是一组SQL指令,这一组SQL指令必须全部执行成功,若因为某个原因未全部执行成功(例如其中一行SQL有错误),则先前所有执行过的SQL指令都会被撤消。

JDBC是如何控制事务的try ...{.....connection.setAutoCommit(false);.....// 一连串SQL操作mit();} catch(SQLException) ...{// 发生错误,撤消所有变更connection.rollback();}Spring是把JDBC事务管理进来了封装,Spring事务管理的抽象关键在于org.springframework.transaction.PlatformTransactionManager接口里面有commit 和rollbackpublic interface PlatformTransactionManager ...{TransactionStatus getTransaction(TransactionDefinitiondefinition) throws TransactionException;void commit(TransactionStatus status)throws TransactionException;void rollback(TransactionStatus status)throws TransactionException;}TransactionDefinition接口的实例定义了事务的隔离程度(Isolation level)传播行为(Propagation behavior)超时(Timeout)只读(Read-only)等DataSourceTransactionManager、HibernateTransactionManager、JdoTransaction- Manager、JtaTransactionManager等是实现了该接口Spring提供编程式的事务管理(Programmatic transaction management)与声明式的事务管理(Declarative transaction management):1、编程式的事务管理可以清楚地控制事务的边界,也就是让您自行实现事务开始时间、撤消操作的时机、结束时间等,可以实现细粒度的事务控制。

spring工作流程

spring工作流程

spring工作流程Spring工作流程。

Spring是一个开源的轻量级Java开发框架,它提供了广泛的基础设施支持,使得Java开发变得更加简单高效。

Spring框架的工作流程是开发者必须深入了解和掌握的重要内容之一。

本文将从Spring框架的工作流程入手,为大家详细介绍Spring框架的工作原理和流程。

首先,Spring框架的工作流程可以分为以下几个主要步骤,配置、初始化、依赖注入、AOP代理、生命周期管理等。

在开始使用Spring框架进行开发之前,我们需要先进行配置。

Spring框架的配置通常使用XML或者注解的方式进行,开发者可以根据自己的实际需求选择合适的配置方式。

配置完成后,Spring容器会对配置文件进行解析,并初始化相应的Bean定义。

接下来,Spring框架会进行Bean的初始化工作。

在初始化阶段,Spring容器会根据配置文件中的Bean定义,实例化相应的Bean对象,并对Bean进行属性注入和依赖注入。

依赖注入是Spring框架的核心功能之一,它可以帮助开发者管理Bean之间的依赖关系,从而实现松耦合的设计。

一旦Bean初始化完成并且依赖注入完成,Spring框架就会对Bean进行AOP代理。

AOP(面向切面编程)是Spring框架的另一个重要特性,它可以帮助开发者实现横切关注点的模块化,从而提高代码的复用性和可维护性。

Spring框架通过AOP代理可以在不修改原有代码的情况下,对Bean的方法进行增强、拦截和控制。

除了AOP代理之外,Spring框架还会对Bean的生命周期进行管理。

Bean的生命周期包括初始化、使用和销毁三个阶段。

Spring 框架可以通过BeanPostProcessor和InitializingBean等接口来帮助开发者管理Bean的生命周期,确保Bean在不同阶段都能够得到正确的处理和管理。

总结一下,Spring框架的工作流程包括配置、初始化、依赖注入、AOP代理和生命周期管理等几个主要步骤。

spring 流程

spring 流程

spring 流程Spring 流程。

Spring 是一个开源的、轻量级的、非侵入式的框架,它的主要目的是简化企业级应用的开发。

在 Spring 框架中,流程是非常重要的,它贯穿了整个应用程序的生命周期。

本文将深入探讨 Spring 框架中的流程,帮助读者更好地理解 Spring 框架的运行机制。

1. IoC 容器初始化。

在 Spring 框架中,IoC(Inversion of Control,控制反转)容器是核心的部分。

当应用程序启动时,IoC 容器会被初始化。

在初始化过程中,IoC 容器会读取配置文件,扫描注解,创建 Bean 定义,并且将这些 Bean 定义注册到容器中。

这个过程是整个Spring 应用程序的起点,它为后续的流程提供了基础。

2. Bean 实例化。

在 IoC 容器初始化完成后,容器会根据 Bean 的定义信息,实例化相应的 Bean 对象。

这个过程是通过反射机制来实现的,容器会根据配置信息来创建 Bean 对象,并且将这些 Bean 对象放入容器中管理。

Bean 实例化的过程是 Spring 框架中非常重要的一部分,它决定了应用程序中各个组件的创建和管理方式。

3. 依赖注入。

依赖注入是 Spring 框架中的一个重要特性,它使得组件之间的依赖关系由容器来管理。

在 Bean 实例化完成后,容器会根据配置信息,将依赖关系注入到相应的 Bean 中。

这个过程是通过构造函数注入、属性注入或者方法注入来实现的,它使得应用程序的各个组件能够更加灵活地协作。

4. AOP 拦截器链。

AOP(Aspect-Oriented Programming,面向切面编程)是Spring 框架中的另一个重要特性,它通过拦截器链的方式来实现横切关注点的功能。

在应用程序运行过程中,AOP 拦截器链会拦截指定的方法调用,并且在方法执行前、后或者异常抛出时执行相应的逻辑。

这个过程是通过代理对象来实现的,它为应用程序的横切关注点提供了一种非侵入式的解决方案。

S详细讲解SH中Spring事务流程

S详细讲解SH中Spring事务流程

给你详细讲一下SSH框架的事物管理,希望对你有帮助.Struts+hibernate+spring整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring的配置做一下剖析,一边与大家一起分享经验:1、准备工作:可以利用hibernate tools生成相关映射文件已经po对象、dao对象,dao 也可以自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则可以更轻松的实现关键就在于配置文件,下面看一个样例:<xml version="" encoding="utf-8"><beans xmlns=" "xmlns:xsi=" "xsi:schemaLocation=" "><--配置数据源--><bean id="dataSource" class="" destroy-method="close"><-- 指定连接数据库的驱动 --><property name="driverClass" value=""/><-- 指定连接数据库的URL --><property name="jdbcUrl" value="jdbc:"/><-- 指定连接数据库的用户名 --><property name="user" value="root"/><-- 指定连接数据库的密码 --><property name="password" value="root"/><-- 指定连接数据库连接池的最大连接数 --><property name="maxPoolSize" value="20"/><-- 指定连接数据库连接池的最小连接数 --><property name="minPoolSize" value="1"/><-- 指定连接数据库连接池的初始化连接数 --><property name="initialPoolSize" value="1"/><-- 指定连接数据库连接池的连接的最大空闲时间 --> <property name="maxIdleTime" value="20"/></bean><--配置数据库会话工厂--><bean id="sessionFactory" class=""><property name="dataSource" ref="dataSource"/> <property name="mappingResources"><list><value>com/ouya/ </list></property><property name="hibernateProperties"><props><prop key=""> <prop key="">true</prop><prop key="">true</prop></props></property></bean><--配置事务管理器--><bean id="transactionManager" class=""><property name="sessionFactory"><reflocal="sessionFactory"/></property></bean><—-配置Spring 事务管理器代理 --><bean id="transactionProxyFactory" abstract="true" lazy-init="true" class=""><property name="transactionManager"><ref local="transactionManager"/></property><property name="transactionAttributes"><props><prop key="save">PROPAGATION_REQUIRED</prop><prop key="insert">PROPAGATION_REQUIRED</prop><prop key="del">PROPAGATION_REQUIRED</prop><prop key="add">PROPAGATION_REQUIRED</prop><prop key="update">PROPAGATION_REQUIRED</prop><prop key="find">PROPAGATION_REQUIRED,readOnly</prop> <propkey="search">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove">PROPAGATION_REQUIRED,readOnly</prop><propkey="query">PROPAGATION_REQUIRED,readOnly</prop><prop key="list">PROPAGATION_REQUIRED,readOnly</prop> <propkey="count">PROPAGATION_REQUIRED,readOnly</prop><prop key="get">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean><-- Hibernate模板 --><bean id="hibernateTemplate" class=""> <property name="sessionFactory"><ref local="sessionFactory" /></property></bean><--服务层对象--><bean id="us" class=""><property name="userDao"><ref local="userDao"/></property></bean><-- spring代理用户服务对象 --><bean id="userService" parent="transactionProxyFactory"><-- 如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass为true,否则会报classcast异常 --><--<property name="proxyTargetClass" value="true"/>--><property name="target" ref="us"/></bean><-- 用户数据访问对象DATA ACCESS OBJECT --><bean id="userDao" class=""><property name="hibernateTemplate" ref="hibernateTemplate"/> </bean></beans>可以看到配置文件的步骤:1、配置数据源2、配置会话工厂依赖注入上面的数据源,还要注入hbm映射文件注意正确的位置、hibernate属性文件3、配置事务管理器依赖注入上面的会话工厂4、 Spring中声明事务管理器根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes后面的一些普通的bean配置就不用说了上面的例子中使用的声明事务管理器是:TransactionProxyFactoryBean,这样的话我们就需要在后面配置目标bean,比如上面的例子中我们的原服务对象是id为us的UserService没有实现接口,所以我们为他配置了id 为userService的代理对象目标bean,程序中使用时只能通过使用代理对象才能实现数据库操作功能代理对象的父类是上面声明的事务管理器,一边我们使用的时候开启事务,如果直接使用服务对象就无法开启事务程序中调用:UserService us = UserService "userService";注:userService就是上面配置的代理对象的id,而不是原服务对象的id但是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator根据beanname自动代理,上面的配置文件需要做改动,做两件事当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的:1、增加一个事务拦截器<bean id="transactionInterceptor" class=""><property name="transactionManager"><ref local="transactionManager"/></property><property name="transactionAttributes"><props><prop key="save">PROPAGATION_REQUIRED</prop><prop key="insert">PROPAGATION_REQUIRED</prop><prop key="del">PROPAGATION_REQUIRED</prop><prop key="add">PROPAGATION_REQUIRED</prop><prop key="update">PROPAGATION_REQUIRED</prop><prop key="find">PROPAGATION_REQUIRED,readOnly</prop><propkey="search">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove">PROPAGATION_REQUIRED,readOnly</prop><propkey="query">PROPAGATION_REQUIRED,readOnly</prop><prop key="list">PROPAGATION_REQUIRED,readOnly</prop> <propkey="count">PROPAGATION_REQUIRED,readOnly</prop><prop key="get">PROPAGATION_REQUIRED,readOnly</prop> </props></property></bean>2、定义自动代理事务管理器<-- 定义BeanNameAutoProxyCreator--><bean class=""><-- 如果服务层对象是接口实现类,则需要设置proxyTargetClass属性为true --><--<property name="proxyTargetClass" value="true"--><-- 指定对满足哪些bean name的bean自动生成业务代理 --> <property name="beanNames"><-- 下面是所有需要自动创建事务代理的bean--><list><value>us</value></list><-- 此处可增加其他需要自动创建事务代理的bean--></property><-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器--><property name="interceptorNames"><list><-- 此处可增加其他新的Interceptor --><value>transactionInterceptor</value></list></property></bean>然后我们在程序中调用时应如下:UserService us = UserService "us";注:注意与上面使用TransactionProxyFactoryBean时的调用区别,此处我们用getbean时直接取原服务层对象的id,不需要去配置目标bea,这也正是BeanNameAutoProxyCreator根据bean名称自动代理的含义所在附录:1、hibernate的属性详解:<bean id="dataSource" class="" destroy-method="close"><-- 以下配置都是使用属性文件中的配置,而之所以可以这样写,就是因为有属性占位符配置的原因 --><property name="driverClass" value="${}"/><property name="jdbcUrl" value="${}"/><property name="user" value="${}"/><property name="password" value="${}"/><-- 连接池维持的最小的连接个数 --><property name="minPoolSize" value="5"/><-- 连接池维持的最大的连接个数 --><property name="maxPoolSize" value="20"/><-- 最大空闲时间, 当某个连接在这个时间内没活动后将从池中移除,前提是池中至少多于最少的连接数: minPoolSize --><property name="maxIdleTime" value="1800"/><-- 为加强准备语句的执行性能,此参数指定被缓存的PreparedStatement 的个数 --><property name="maxStatements" value="50"/></bean>Hibernate 会话厂 SessionFactorySession 就是用于每次与数据库会话的,因此需要:数据库的配置参数,这些参数就是上面的数据源指定的因此我们只需引用即可: ref="dataSource";实体映射配置配置结果缓存配置这里使用的是开源的 ehcache<-- Hibernate SessionFactory --><bean id="sessionFactory" class=""><-- 引用前面定义的数据源 --><property name="dataSource" ref="dataSource"/><-- 所有实体映射文件列表, 所有的文件 --><property name="mappingResources"><list><value>org/springframework/samples/jpetstore/domain/ 传统上的文件的参数放在这里 --><property name="hibernateProperties"><props><-- 指定数据库方言 --><prop key="">${}</prop><-- 是否在日志中输出所有Hibernate与数据库交互的SQL语句 --> <prop key="">true</prop><-- 是否在日志中输出的SQL 语句格式化成易读形式 --><prop key="">true</prop><-- 是否显示统计形式,一般在测试阶段使用 --><prop key="">true</prop><-- 对于级联查询,一次性获取的级联深度, todo 需进一步研究 --><prop key="">2</prop><--Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30、50、100.Oracle数据库的JDBC驱动默认的Fetch Size=15,设置Fetch Size设置为:30、50,性能会有明显提升,如果继续增大,超出100,性能提升不明显,反而会消耗内存.--><prop key="">100</prop><--不必等到累计到50个SQL之后才执行.只要事务commit后,不管缓存中有多少条sql语句都要执行.参数只是设定一次最多可以提交多少sql语句的上限,提高sql语句的执行效率--><prop key="">50</prop><--1create 在每次SesstionFactory 构建时一般是应用重启时,或者伴随着应用服务器重启时,先将之前数据库中的所有数据全部清空,后紧跟着根据所有的映射文件重新创建新的数据库表2create-drop 除了create 的所有含义之外,在每次应用的退出前,将进行一次数据空清空.因此这个配置将有两次清空操作,一次是退出,一次是启动时.3update如果在开发阶段理发了实体对象的映射文件的定义后,此配置将后台的数据库表进行更新如增加表的列4validate用于校验现有的表与现有的配置是否一致.--><prop key="">update</prop><-- 见下面的解释 --><prop key="">update</prop><--结果缓存配置:- 将置于 classpath 中- 如果不设置“查询缓存”,那么hibernate只会缓存使用load方法获得的单个持久化对象,如果想缓存使用findall、 list、Iterator、createCriteria、createQuery等方法获得的数据结果集的话,就需要设置true 才行- 在Hbm文件中添加<cache usage="read-only"/>-如果需要“查询缓存”,还需要在使用Query或Criteria时设置其setCacheabletrue;属性--><prop key="">true</prop><prop key=""> 为解决 merge方法语义的歧义 todo 以后进一步解析或者你可以看一下相应的文档 --><property name="eventListeners"><map><entry key="merge"><bean class=""/></entry></map></property></bean>2、Spring的transactionAttributesPROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行.PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常. PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起.PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起.PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行.如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作. PROPAGATION_REQUIRED意思是支持当前事务,如果当前没有事务,就新建一个事务.insert意思是对所有以insert开头的方法应用事务控制.list, set, map和props元素分别用来设置类型为List,Set,Map和Propertis的属性值,分别用来为bean传入集合值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

给你详细讲一下SSH框架的事物管理,希望对你有帮助。

Struts+hibernate+spring整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring 的配置做一下剖析,一边与大家一起分享经验:1、准备工作:可以利用hibernate tools生成相关映射文件已经po对象、dao对象,dao 也可以自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则可以更轻松的实现关键就在于配置文件,下面看一个样例:<xml version="" encoding="utf-8"><beans xmlns=" "xmlns:xsi=" "xsi:schemaLocation=" "><!--配置数据源--><bean id="dataSource" class="" destroy-method="close"><!-- 指定连接数据库的驱动 --><property name="driverClass" value=""/><!-- 指定连接数据库的URL --><property name="jdbcUrl" value="jdbc:"/><!-- 指定连接数据库的用户名 --><property name="user" value="root"/><!-- 指定连接数据库的密码 --><property name="password" value="root"/><!-- 指定连接数据库连接池的最大连接数 --><property name="maxPoolSize" value="20"/><!-- 指定连接数据库连接池的最小连接数 --><property name="minPoolSize" value="1"/><!-- 指定连接数据库连接池的初始化连接数 --><property name="initialPoolSize" value="1"/><!-- 指定连接数据库连接池的连接的最大空闲时间 --> <property name="maxIdleTime" value="20"/></bean><!--配置数据库会话工厂--><bean id="sessionFactory" class=""><property name="dataSource" ref="dataSource"/> <property name="mappingResources"><list><value>com/ouya/ </list></property><property name="hibernateProperties"><props><prop key=""> <prop key="">true</prop><prop key="">true</prop></props></property></bean><!--配置事务管理器--><bean id="transactionManager" class=""><property name="sessionFactory"><reflocal="sessionFactory"/></property></bean><!—-配置Spring 事务管理器代理 --><bean id="transactionProxyFactory" abstract="true" lazy-init="true" class=""><property name="transactionManager"><ref local="transactionManager"/></property><property name="transactionAttributes"><props><prop key="save*">PROPAGATION_REQUIRED</prop><prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="del*">PROPAGATION_REQUIRED</prop><prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop> <propkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><propkey="list*">PROPAGATION_REQUIRED,readOnly</prop><propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props></property></bean><!-- Hibernate模板 --><bean id="hibernateTemplate" class=""><property name="sessionFactory"><ref local="sessionFactory" /></property></bean><!--服务层对象--><bean id="us" class=""><property name="userDao"><ref local="userDao"/></property></bean><!-- spring代理用户服务对象 --><bean id="userService" parent="transactionProxyFactory"><!-- 如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass为true,否则会报classcast异常 --><!--<property name="proxyTargetClass" value="true"/>--><property name="target" ref="us"/></bean><!-- 用户数据访问对象DATA ACCESS OBJECT --><bean id="userDao" class=""><property name="hibernateTemplate" ref="hibernateTemplate"/> </bean></beans>可以看到配置文件的步骤:1、配置数据源2、配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[注意正确的位置]、hibernate属性文件)3、配置事务管理器(依赖注入上面的会话工厂)4、 Spring中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes)后面的一些普通的bean配置就不用说了上面的例子中使用的声明事务管理器是:TransactionProxyFactoryBean,这样的话我们就需要在后面配置目标bean,比如上面的例子中我们的原服务对象是id为us的UserService(没有实现接口),所以我们为他配置了id为userService的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据库操作功能(代理对象的父类是上面声明的事务管理器,一边我们使用的时候开启事务),如果直接使用服务对象就无法开启事务程序中调用:UserService us = (UserService) ("userService");注:userService就是上面配置的代理对象的id,而不是原服务对象的id但是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的配置文件需要做改动,做两件事(当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的):1、增加一个事务拦截器<bean id="transactionInterceptor" class=""><property name="transactionManager"><ref local="transactionManager"/></property><property name="transactionAttributes"><props><prop key="save*">PROPAGATION_REQUIRED</prop><prop key="insert*">PROPAGATION_REQUIRED</prop><prop key="del*">PROPAGATION_REQUIRED</prop><prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop><propkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><propkey="list*">PROPAGATION_REQUIRED,readOnly</prop><propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props></property></bean>2、定义自动代理事务管理器<!-- 定义BeanNameAutoProxyCreator--><bean class=""><!-- 如果服务层对象是接口实现类,则需要设置proxyTargetClass属性为true --><!--<property name="proxyTargetClass" value="true"--><!-- 指定对满足哪些bean name的bean自动生成业务代理 --> <property name="beanNames"><!-- 下面是所有需要自动创建事务代理的bean--><list><value>us</value></list><!-- 此处可增加其他需要自动创建事务代理的bean--></property><!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器--><property name="interceptorNames"><list><!-- 此处可增加其他新的Interceptor --><value>transactionInterceptor</value></list></property></bean>然后我们在程序中调用时应如下:UserService us = (UserService) ("us");注:注意与上面使用TransactionProxyFactoryBean时的调用区别,此处我们用getbean时直接取原服务层对象的id,不需要去配置目标bea,这也正是BeanNameAutoProxyCreator(根据bean名称自动代理)的含义所在附录:1、关于hibernate的属性详解:<bean id="dataSource" class="" destroy-method="close"><!-- 以下配置都是使用属性文件中的配置,而之所以可以这样写,就是因为有属性占位符配置的原因 --><property name="driverClass" value="${}"/><property name="jdbcUrl" value="${}"/><property name="user" value="${}"/><property name="password" value="${}"/><!-- 连接池维持的最小的连接个数 --><property name="minPoolSize" value="5"/><!-- 连接池维持的最大的连接个数 --><property name="maxPoolSize" value="20"/><!-- 最大空闲时间, 当某个连接在这个时间内没活动后将从池中移除,前提是池中至少多于最少的连接数: minPoolSize --><property name="maxIdleTime" value="1800"/><!-- 为加强准备语句的执行性能,此参数指定被缓存的PreparedStatement 的个数 --><property name="maxStatements" value="50"/></bean>Hibernate 会话厂 SessionFactorySession 就是用于每次与数据库会话的,因此需要:数据库的配置参数,这些参数就是上面的数据源指定的! 因此我们只需引用即可: ref="dataSource";实体映射配置配置结果缓存配置(这里使用的是开源的 ehcache)<!-- Hibernate SessionFactory --><bean id="sessionFactory" class=""><!-- 引用前面定义的数据源 --><property name="dataSource" ref="dataSource"/><!-- 所有实体映射文件列表, 所有的文件 --><property name="mappingResources"><list><value>org/springframework/samples/jpetstore/domain/ 传统上的文件的参数放在这里 --><property name="hibernateProperties"><props><!-- 指定数据库方言 --><prop key="">${}</prop><!-- 是否在日志中输出所有Hibernate与数据库交互的SQL语句 --> <prop key="">true</prop><!-- 是否在日志中输出的SQL 语句格式化成易读形式 --><prop key="">true</prop><!-- 是否显示统计形式,一般在测试阶段使用 --><prop key="">true</prop><!-- 对于级联查询,一次性获取的级联深度, @todo 需进一步研究 --> <prop key="">2</prop><!--Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30、50、100。

相关文档
最新文档