×

spring事务管理接口

spring事务管理接口(为什么加入了spring事务管理机制的程序要直接使用接口的方法)

admin admin 发表于2024-04-25 01:37:22 浏览14 评论0

抢沙发发表评论

大家好,关于spring事务管理接口很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于为什么加入了spring事务管理机制的程序要直接使用接口的方法的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

为什么加入了spring事务管理机制的程序要直接使用接口的方法

是spring事物管理机制在捣鬼下面讲的是什么是spring事物管理机制Spring事务管理机制对于传统的基于特定事务资源的事务处理而言(如基于JDBC 的数据库访问),Spring并不会对其产生什么影响,我们照样可以成功编写并运行这样的代码。同时,Spring还提供了一些辅助类可供我们选择使用,这些辅助类简化了传统的数据库操作流程,在一定程度上节省了工作量,提高了编码效率。对于依赖容器的参数化事务管理而言,Spring 则表现出了极大的价值。Spring本身也是一个容器,只是相对EJB容器而言,Spring显得更为轻便小巧。我们无需付出其他方面的代价,即可通过Spring实现基于容器的事务管理(本质上来讲,Spring的事务管理是基于动态AOP)。下面这段xml配置片断展示了Spring中的事务设定方式:《beans》《bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"》《property name="driverClassName"》《value》org.gjt.mm.mysql.Driver《/value》《/property》《property name="url"》《value》jdbc:mysql://localhost/sample《/value》《/property》《property name="username"》《value》user《/value》《/property》《property name="password"》《value》mypass《/value》《/property》《/bean》《bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"》《property name="dataSource"》《ref local="dataSource" /》《/property》《/bean》 《bean id="userDAO" class="net.xiaxin.dao.UserDAO"》 《property name="dataSource"》 《ref local="dataSource" /》 《/property》 《/bean》 《bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyF actoryBean"》 《property name="transactionManager"》 《ref bean="transactionManager" /》 《/property》 《property name="target"》 《ref local="userDAO" /》 《/property》 《property name="transactionAttributes"》 《props》 《prop key="insert*"》PROPAGATION_REQUIRED《/prop》 《prop key="get*"》《/prop》 《/props》 《/property》 《/bean》《/beans》 配置中包含了dataSource,transactionManager 等资源定义。这些资源都为一个名为userDAOProxy 的TransactionProxyFactoryBean 服务, userDAOProxy 则对包含实际数据逻辑的userDAO进行了事务性封装。可以看到,在userDAOProxy 的"transactionAttributes"属性中,我们定义了针对userDAO 的事务策略,即将所有名称以insert 开始的方法(如UserDAO.insertUser方法)纳入事务管理范围。如果此方法中抛出异常,则Spring将当前事务回滚,如果方法正常结束,则提交事务。而对所有名称以get 开始的方法(如UserDAO.getUser 方法)则以只读的事务处理机制进行处理。(设为只读型事务,可以使持久层尝试对数据操作进行优化,如对于只读事务Hibernate将不执行flush操作,而某些数据库连接池和JDBC 驱动也对只读型操作进行了特别优化。)结合上面这段申明带来的感性认知,看看Spring 的事务管理机制与EJB 中事务管理有何不同,或者有何优势。这里自然有许多方面可以比较,不过,笔者认为其中最为关键的两点是:1. Spring可以将任意Java Class 纳入事务管理这里的UserDAO只是我们编写的一个普通Java Class,其中包含了一些基本的数据应用逻辑。通过Spring,我们即可简单的实现事务的可配置化。也就是说,我们可以随意为某个类的某个方法指定事务管理机制。与之对比,如果使用EJB容器提供的事务管理功能,我们不得不按照EJB规范编将UserDAO 进行改造,将其转换为一个标准的EJB。2. Spring事务管理并不依赖特定的事务资源。EJB 容器必须依赖于JTA 提供事务支持。而Spring 的事务管理则支持JDBC、JTA 等多种事务资源。这为我们提供了更多的选择,从而也使得我们的系统部署更加灵活。对Spring事务管理机制进行简单分析之后,我们将结合持久层封装的具体事务应用机制,对Spring中的事务管理进行更具实效的探讨。祝君早日成功!

spring怎么进行的事务管理,求指导

Spring+Hibernate的实质:就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactionManager,都交给Spring管理。那么再没整合之前Hibernate是如何实现事务管理的呢?通过ServletFilter实现数据库事务的管理,这样就避免了在数据库操作中每次都要进行数据库事务处理。一.事务的4个特性: 原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做。 一致性:数据不会因为事务的执行而遭到破坏。 隔离性:一个事务的执行,不受其他事务(进程)的干扰。既并发执行的个事务之间互不干扰。 持久性:一个事务一旦提交,它对数据库的改变将是永久的。二.事务的实现方式:实现方式共有两种:编码方式;声明式事务管理方式。基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。三.创建事务的时机:是否需要创建事务,是由事务传播行为控制的。读数据不需要或只为其指定只读事务,而数据的插入,修改,删除就需要事务管理了。一种常见的事务管理配置:事务拦截器TransactionInterceptor和事务自动代理BeanNameAutoProxyCreator相结合的方式《!--定义Hibernate的事务管理器HibernateTransactionManager --》 《bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"》 《!-- 依赖注入上面定义的sessionFactory --》 《property name="sessionFactory" ref="sessionFactory"/》 《/bean》《!--定义Spring的事务拦截器TransactionInterceptor --》 《bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"》 《!-- 依赖注入上面定义的事务管理器transactionManager --》 《property name="transactionManager" ref="transactionManager"/》 《!-- 定义需要进行事务拦截的方法及所采用的事务控制类型 --》 《property name="transactionAttributes"》 《props》 《!-- 以browse、list、load、get及is开头的所有方法采用只读型事务控制类型 --》 《prop key="browse*"》PROPAGATION_REQUIRED,readOnly《/prop》 《prop key="list*"》PROPAGATION_REQUIRED,readOnly《/prop》 《prop key="load*"》PROPAGATION_REQUIRED,readOnly《/prop》 《prop key="get*"》PROPAGATION_REQUIRED,readOnly《/prop》 《prop key="is*"》PROPAGATION_REQUIRED,readOnly《/prop》 《!-- 所有方法均进行事务控制,如果当前没有事务,则新建一个事务 --》 《prop key="*"》PROPAGATION_REQUIRED《/prop》 《/props》 《/property》《/bean》《!-- 定义BeanNameAutoProxyCreatorf进行Spring的事务处理--》 《bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"》 《!-- 针对指定的bean自动生成业务代理 --》 《property name="beanNames"》 《list》 《value》adminService《/value》 《value》columnsService《/value》 《value》newsService《/value》 《value》crawlService《/value》 《value》memberLevelService《/value》 《value》memberService《/value》 《value》categoryService《/value》 《value》merService《/value》 《value》cartService《/value》 《value》ordersService《/value》 《value》trafficService《/value》 《/list》 《/property》 《!-- 这个属性为true时,表示被代理的是目标类本身而不是目标类的接口 --》 《property name="proxyTargetClass"》 《value》true《/value》 《/property》 《!-- 依赖注入上面定义的事务拦截器transactionInterceptor --》 《property name="interceptorNames"》 《list》 《value》transactionInterceptor《/value》 《/list》 《/property》 《/bean》

spring的事务管理,有谁能给个好的吗

这是通过Spring AOP实现的。动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使用CGLIB来解决问题,但这不是spring推荐的方式,所以不做讨论.大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择, 因而这是和非侵入性的轻量级容器的观念是一致的。从考虑EJB CMT和Spring声明式事务管理的相似以及不同之处出发是很有益的。 它们的基本方法是相似的:都可以指定事务管理到单独的方法;如果需要可以在事务上 下文调用setRollbackOnly()方法。不同之处如下:不象EJB CMT绑定在JTA上,Spring声明式事务管理可以在任何环境下使用。 只需更改配置文件,它就可以和JDBC、JDO、Hibernate或其他的事务机制一起工作Spring可以使声明式事务管理应用到普通Java对象,不仅仅是特殊的类,如EJBSpring提供声明式回滚规则:EJB没有对应的特性, 我们将在下面讨论这个特性。回滚可以声明式控制,不仅仅是编程式的Spring允许你通过AOP定制事务行为。例如,如果需要,你可以在事务 回滚中插入定制的行为。你也可以增加任意的通知,就象事务通知一样。使用 EJB CMT,除了使用setRollbackOnly(),你没有办法能 够影响容器的事务管理Spring不提供高端应用服务器提供的跨越远程调用的事务上下文传播。如 果你需要这些特性,我们推荐你使用EJB。然而,不要轻易使用这些特性。通常我 们并不希望事务跨越远程调用回滚规则的概念是很重要的:它们使得我们可以指定哪些异常应该发起自 动回滚。我们在配置文件中,而不是Java代码中,以声明的方式指定。因此,虽然我们仍 然可以编程调用TransactionStatus对象的 setRollbackOnly()方法来回滚当前事务,多数时候我们可以 指定规则,如MyApplicationException应该导致回滚。 这有显著的优点,业务对象不需要依赖事务基础设施。例如,它们通常不需要引 入任何Spring API,事务或其他任何东西。

Spring事务管理高级应用难点剖析(2)

   应用分层的迷惑

  Web Service及DAO三层划分就像西方国家的立法 行政 司法三权分立一样被奉为金科玉律 甚至有开发人员认为如果要使用Spring事务管理就一定先要进行三层的划分 这个看似荒唐的论调在开发人员中颇有市场 更有甚者 认为每层必须先定义一个接口 然后再定义一个实现类 其结果是 一个很简单的功能 也至少需要 个接口 个类 再加上视图层的JSP和JS等 打牌都可以转上两桌了 这种误解贻害不浅

  对将 面向接口编程 奉为圭臬 认为放之四海而皆准的论调 笔者深不以为然 是的 面向接口编程 是MartinFowler RodJohnson这些大师提倡的行事原则 如果拿这条原则去开发架构 开发产品 怎么强调都不为过 但是 对于我们一般的开发人员来说 做的最多的是普通工程项目 往往最多的只是一些对数据库增 删 查 改的功能 此时 面向接口编程 除了带来更多的类文件外 看不到更多其它的好处

  Spring框架提供的所有附加的好处(AOP 注解增强 注解MVC等)唯一的前提就是让POJO的类变成一个受Spring容器管理的Bean 除此以外没有其它任何的要求 下面的实例用一个POJO完成所有的功能 既是Controller 又是Service 还是DAO

  清单 MixLayerUserService java

   packageuser mixlayer;

   import springframework beans factory annotation Autowired;

   import sprire JdbcTemplate;

   import springframework stereotype Controller;

   import springframework web bind annotation RequestMapping;

   //① 将POJO类通过注解变成SpringMVC的Controller

   @Controller

   publicclassMixLayerUserService{

  

   //② 自动注入JdbcTemplate

   @Autowired

   privateJdbcTemplatejdbcTemplate;

  

   //③ 通过SpringMVC注解映URL请求

   @RequestMapping( /logon do )

   publicStringlogon(StringuserName Stringpassword){

   if(isRightUser(userName password)){

   Stringsql= UPDATEt_useruSETu score=u score+?WHEREuser_name=? ;

   jdbcTemplate update(sql userName);

   return success ;

   }else{

   return fail ;

   }

   }

   privatebooleanisRightUser(StringuserName Stringpassword){

   //dosth

   returntrue;

   }

   }

  通过@Controller注解将MixLayerUserService变成Web层的Controller 同时也是Service层的服务类 此外 由于直接使用JdbcTemplate访问数据 所以MixLayerUserService还是一个DAO 来看一下对应的Spring配置文件

  清单 applicationContext xml

   《?xmlversionxmlversion= encoding= UTF ?》

   《beansxmln *** eansxmlns=

   xmlns:xsi= instance

   xmlns:context=

   xmlns:p=

   xmlns:aop=

   xmlns:tx=

   xsi:schemaLocation=

   beans xsd

  

   context xsd

  

   aop xsd

  

   tx xsd 》

  

   《context:ponent scanbase packagecontext:ponent scanbase package= user mixlayer /》

  

   《beanclas *** eanclass= springframework web servlet mvc annotation

   AnnotationMethodHandlerAdapter /》

  

  

   《beanclas *** eanclass= springframework web servlet view

   InternalResourceViewResolver

   pp:prefix= /WEB INF/jsp/ p:suffix= jsp /》

  

  

   《beanidbeanid= dataSource

   class= mons dbcp BasicDataSource

   destroy method= close

   p:driverClassName= oracle jdbc driver OracleDriver

   p:url= jdbc:oracle:thin:@localhost: :orcl

   p:username= test

   p:password= test /》

  

   《beanidbeanid= jdbcTemplate

   class= sprire JdbcTemplate

   p:dataSource ref= dataSource /》

  

  

   《beanidbeanid= jdbcManager

   class= springframework jdbc datasource DataSourceTransactionManager

   p:dataSource ref= dataSource /》

  

  

   《aop:configproxy target classaop:configproxy target class= true 》

   《aop:pointcutidaop:pointcutid= serviceJdbcMethod

   expression= execution(public*user mixlayer MixLayerUserService *( )) /》

   《aop:advisorpointcut refaop:advisorpointcut ref= serviceJdbcMethod

   advice ref= jdbcAdvice order= /》

   《/《 span》aop:config》

   《tx:adviceidtx:adviceid= jdbcAdvice transaction manager= jdbcManager 》

   《tx:attributes》

   《tx:methodnametx:methodname= * /》

   《/《 span》tx:attributes》

   《/《 span》tx:advice》

   《/《 span》beans》

  在①处 我们定义配置了AnnotationMethodHandlerAdapter 以便启用SpringMVC的注解驱动功能 而②和③处通过Spring的aop及tx命名空间 以及Aspject的切点表达式语法进行事务增强的定义 对MixLayerUserService的所有公有方法进行事务增强 要使程序能够运行起来还必须进行web xml的相关配置

  清单 web xml

   《?xmlversionxmlversion= encoding= GB ?》

   《web appversionweb appversion= xmlns=

   xmlns:xsi= instance

   xsi:schemaLocation=

   app_ _ xsd 》

   《context param》

   《param name》contextConfigLocation《/《 span》param name》

   《param value》classpath*:user/mixlayer/applicationContext xml《/《 span》param value》

   《/《 span》context param》

   《context param》

   《param name》log jConfigLocation《/《 span》param name》

   《param value》/WEB INF/classes/log j properties《/《 span》param value》

   《/《 span》context param》

  

   《listener》

   《listener class》

   springframework web util Log jConfigListener

   《/《 span》listener class》

   《/《 span》listener》

   《listener》

   《listener class》

   sprntext ContextLoaderListener

   《/《 span》listener class》

   《/《 span》listener》

  

   《servlet》

   《servlet name》user《/《 span》servlet name》

   《servlet class》

   springframework web servlet DispatcherServlet

   《/《 span》servlet class》

  

   《init param》

   《param name》contextConfigLocation《/《 span》param name》

   《param value》classpath:user/mixlayer/applicationContext xml《/《 span》param value》

   《/《 span》init param》

   《load on startup》 《/《 span》load on startup》

   《/《 span》servlet》

   《servlet mapping》

   《servlet name》user《/《 span》servlet name》

   《url pattern》* do《/《 span》url pattern》

   《/《 span》servlet mapping》

   《/《 span》web app》

  这个配置文件很简单 唯一需要注意的是DispatcherServlet的配置 默认情况下SpringMVC根据Servlet的名字查找WEB INF下的 servlet xml作为SpringMVC的配置文件 在此 我们通过contextConfigLocation参数显式指定SpringMVC配置文件的确切位置

  将 springframework jdbc及 springframework transaction的日志级别设置为DEBUG 启动项目 并访问应用 MixLayerUserService#logon方法将作出响应 查看后台输出日志

  清单 执行日志

   : : DEBUG(AbstractPlatformTransactionManager java: )

   Creatingnewtransactionwithname

   :PROPAGATION_REQUIRED ISOLATION_DEFAULT

   : : DEBUG(DataSourceTransactionManager java: )

   AcquiredConnection

   forJDBCtransaction

   : : DEBUG(DataSourceTransactionManager java: )

   SwitchingJDBCConnection

   tomanualmit

   : : DEBUG(JdbcTemplate java: )

   ExecutingpreparedSQLupdate

   : : DEBUG(JdbcTemplate java: )

   ExecutingpreparedSQLstatement

  

   : : DEBUG(JdbcTemplate java: )

   SQLupdateaffected rows

   : : DEBUG(AbstractPlatformTransactionManager java: )

   Initiatingtransactionmit

   : : DEBUG(DataSourceTransactionManager java: )

   CommittingJDBCtransactiononConnection

  

   : : DEBUG(DataSourceTransactionManager java: )

   ReleasingJDBCConnection

   aftertransaction

   : : DEBUG(DataSourceUtils java: )

   ReturningJDBCConnectiontoDataSource

lishixinzhi/Article/program/Java/ky/201311/27924

为什么加入了spring事务管理机制的程序要直接使用接口的方法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于为什么加入了spring事务管理机制的程序要直接使用接口的方法、为什么加入了spring事务管理机制的程序要直接使用接口的方法的信息别忘了在本站进行查找哦。