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

Posted

篇首语:什么是知识?它不是别的,是记录下来的经验。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring事务管理高级应用难点剖析(2)相关的知识,希望对你有一定的参考价值。

Spring事务管理高级应用难点剖析(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  应用分层的迷惑

  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 ?>

   <beansxmlnsbeansxmlns=

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

  

   <beanclassbeanclass= springframework web servlet mvc annotation

   AnnotationMethodHandlerAdapter />

  

  

   <beanclassbeanclass= 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

   [user mixlayer MixLayerUserService logon]:PROPAGATION_REQUIRED ISOLATION_DEFAULT

   : : DEBUG(DataSourceTransactionManager java: )

   AcquiredConnection[mons dbcp PoolableConnection@ e cbf]

   forJDBCtransaction

   : : DEBUG(DataSourceTransactionManager java: )

   SwitchingJDBCConnection

   [mons dbcp PoolableConnection@ e cbf]tomanualmit

   : : DEBUG(JdbcTemplate java: )

   ExecutingpreparedSQLupdate

   : : DEBUG(JdbcTemplate java: )

   ExecutingpreparedSQLstatement

   [UPDATEt_useruSETu score=u score+?WHEREuser_name=?]

   : : DEBUG(JdbcTemplate java: )

   SQLupdateaffected rows

   : : DEBUG(AbstractPlatformTransactionManager java: )

   Initiatingtransactionmit

   : : DEBUG(DataSourceTransactionManager java: )

   CommittingJDBCtransactiononConnection

   [mons dbcp PoolableConnection@ e cbf]

   : : DEBUG(DataSourceTransactionManager java: )

   ReleasingJDBCConnection[mons dbcp PoolableConnection@ e cbf]

   aftertransaction

   : : DEBUG(DataSourceUtils java: )

   ReturningJDBCConnectiontoDataSource

cha138/Article/program/Java/ky/201311/27924

相关参考

知识大全 VS2005数据存取层深入剖析高级篇

VS2005数据存取层深入剖析高级篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一扩展表格适配器

知识大全 Spring MVC框架的高级配置(下)

SpringMVC框架的高级配置(下)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  上文介绍S

知识大全 spring 2.0 的事务自动处理

  <aop:config>       <!<aop:advisorid=userManagerTxad

知识大全 spring连接池配置详解

  数据库连接池概述  数据库连接是一种关键的有限的昂贵的资源这一点在多用户的网页应用程序中体现得尤为突出对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性影响到程序的性能指标数据库连接池正是

知识大全 对应用程序进行性能剖析

高性能MySQL:对应用程序进行性能剖析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对应用程

知识大全 编写高级JavaScript应用代码[2]

Java应用:编写高级JavaScript应用代码[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 编写高级JavaScript应用代码[2]

Java进阶:编写高级JavaScript应用代码[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 数据库设计三大范式应用实例剖析

  引言  数据库的设计范式是数据库设计所需要满足的规范满足这些规范的数据库是简洁的结构明晰的同时不会发生插入(insert)删除(delete)和更新(update)操作异常反之则是乱七八糟不仅给数

知识大全 自动内存管理机制深入剖析-C#分析篇

自动内存管理机制深入剖析-C#分析篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在NETFr

知识大全 循序渐进讲解SQL查询语句的高级应用技巧[2]

数据库进阶:循序渐进讲解SQL查询语句的高级应用技巧[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一