日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring的事务管理难点剖析:应用分层的迷惑

發布時間:2025/4/5 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring的事务管理难点剖析:应用分层的迷惑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

Web、Service及DAO三層劃分就像西方國家的立法、行政、司法三權分立一樣被奉為金 科玉律,甚至有的開發人員認為如果要使用Spring的事務 管理就一定要先進行三層的劃分。這個看似荒唐的論調在開發人員中頗有市場。更有甚者,認為每層必須先定義一個接口,然后再定義一個實現類。其結果是:一個 很簡單的功能,也至少需要3個接口和3個類,再加上視圖層的JSP和JS等,打牌都可以圍上兩桌了,這種誤解貽害不淺。
?? 對將“面向接口編程” 奉為圭臬,認為放之四海而皆準的論調,筆者深不以為然。是的,“面向接口編程”是Martin Fowler、Rod Johnson這些大師提倡的行事原則。如果拿這條原則去開發框架和產品,怎么強調都不為過。但是,對于我們一般的開發人員來說,做的最多的是普通工程項 目,往往只是一些對數據庫增、刪、查、改的功能。此時,“面向接口編程”除了帶來更多的類文件外,看不到更多其他的好處。

? Spring框架所提供的各種好處(如AOP、注解增強、注解MVC等)的唯一前提就是讓POJO的類變成一個受Spring容器管理的Bean,除此以 外沒有其他任何的要求。下面的實例用一個POJO完成所有的功能,既是Controller,又是Service,還是DAO:

package?com.baobaotao.mixlayer;?02??? 03?import?org.springframework.beans.factory.annotation.Autowired;? 04?import?org.springframework.jdbc.core.JdbcTemplate;? 05?import?org.springframework.stereotype.Controller;? 06?import?org.springframework.web.bind.annotation.RequestMapping;? 07??? 08?//①將POJO類通過注解變成Spring?MVC的Controller? 09?@Controller 10?public?class?MixLayerUserService?{? 11??? 12?????//②自動注入JdbcTemplate? 13?????@Autowired 14?????private?JdbcTemplate?jdbcTemplate;? 15??? 16?????//③通過Spring?MVC注解映射成為處理HTTP請求的函數,同時作為一個擁有事務性的方法? 17?????@RequestMapping("/logon.do")? 18?????@Transactional 19?????public?String?logon(String?userName,String?password){? 20?????????if(isRightUser(userName,password)){? 21?????????????String?sql?=?"UPDATE?t_user?u?SET?u.score?=?u.score?+???WHERE?user_name?=?";? 22?????????????jdbcTemplate.update(sql,20,userName);? 23?????????????return?"success";? 24?????????}else{? 25?????????????return?"fail";? 26?????????}? 27?????}? 28??????? 29?????private?boolean?isRightUser(String?userName,String?password){? 30?????????//do?sth? 31?????????return?true;? 32?????}? 33?}

通過@Controller注解將MixLayerUserService變成Web層的Controller,同時也是Service層的服務類。此 外,由于直接使用JdbcTemplate訪問數據,所以MixLayerUserService還是一個DAO。來看一下對應的Spring配置文件:

<?xml?version="1.0"?encoding="UTF-8"??>?02?<beans?xmlns="http://www.springframework.org/schema/beans" 03????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 04????????xmlns:context="http://www.springframework.org/schema/context" 05????????xmlns:p="http://www.springframework.org/schema/p"?xmlns:aop="http://www.springframework.org/schema/aop" 06????????xmlns:tx="http://www.springframework.org/schema/tx" 07???????? xsi:schemaLocation="http://www.springframework.org/schema/beans? http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 08?????http://www.springframework.org/schema/context? http://www.springframework.org/schema/context/spring-context-3.0.xsd? http://www.springframework.org/schema/aop? http://www.springframework.org/schema/aop/spring-aop-3.0.xsd? http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd">? 09?????…? 10?????<!--①事務管理配置->? 11?????<bean?id="transactionManager"? 12???????????class="org.springframework.jdbc.datasource.DataSourceTransactionManager"? 13???????????p:dataSource-ref="dataSource"/>? 14?????<tx:annotation-driven/>? 15??? 16??????????? 17?????<!--②啟動Spring?MVC的注解功能--> 18?????<bean?class="org.springframework.web.servlet.mvc.annotation.? 19???????????????????AnnotationMethodHandlerAdapter"/>? 20?????<bean?class="org.springframework.web.servlet.view.InternalResourceViewResolver" 21???????????p:prefix="/WEB-INF/jsp/"?p:suffix=".jsp"/>? 22?</beans>

在①處,通過事務注解驅動使MixLayerUserService的logon()工作于事務環境下,②處配置了Spring MVC的一些基本設施。要使程序能夠運行起來還必須進行web.xml的相關配置:

<?xml?version="1.0"?encoding="UTF-8"?>?02?<web-app?version="2.5"?xmlns="http://java.sun.com/xml/ns/javaee" 03?????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 04?????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee?? 05?????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">? 06?????<context-param>? 07?????????<param-name>contextConfigLocation</param-name>? 08?????????<param-value>classpath:com/baobaotao/mixlayer/applicationContext.xml</param-value>? 09?????</context-param>? 10?????<context-param>? 11?????????<param-name>log4jConfigLocation</param-name>? 12?????????<param-value>/WEB-INF/classes/log4j.properties</param-value>? 13?????</context-param>? 14??? 15?????<listener>? 16?????????<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>? 17?????</listener>? 18?????<listener>? 19?????????<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>? 20?????</listener>? 21??? 22?????<servlet>? 23?????????<servlet-name>user</servlet-name>? 24?????????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>? 25?????????<init-param>? 26?????????????<param-name>contextConfigLocation</param-name>? 27?????????????<param-value>classpath:com/baobaotao/mixlayer/applicationContext.xml</param-value>? 28?????????</init-param>? 29?????????<load-on-startup>1</load-on-startup>? 30?????</servlet>? 31?????<servlet-mapping>? 32?????????<servlet-name>user</servlet-name>? 33?????????<url-pattern>*.do</url-pattern>? 34?????</servlet-mapping>? 35?</web-app>

這個配置文件很簡單,唯一需要注意的是DispatcherServlet的配置。默認情況下Spring MVC根據Servlet的名字查找WEB-INF下的<servletName>-servlet.xml作為Spring MVC的配置文件,在此,我們通過contextConfigLocation參數顯式指定Spring MVC配置文件的確切位置。
?? 將org.springframework.jdbc及org.springframework.transaction的日志級別設置為DEBUG,啟 動項目,并訪問http://localhost:8088/chapter10/logon.do?userName=tom應 用,MixLayerUserService#logon方法將作出響應,查看后臺輸出日志,如下所示:

引用
Returning cached instance of singleton bean 'transactionManager'
? Creating new transaction with name [com.baobaotao.mixlayer.MixLayerUserService.logon]:???
??? PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
(DataSourceTransactionManager.java:204) - Acquired Connection [jdbc:mysql://localhost:3306/sampledb, UserName=root@localhost , MySQL-AB JDBC Driver] for JDBC transaction
(DataSourceTransactionManager.java:221) - Switching JDBC Connection [jdbc:mysql://localhost:3306/sampledb, UserName=root@localhost , MySQL-AB JDBC Driver] to manual commit
(JdbcTemplate.java:810) - Executing prepared SQL update
(JdbcTemplate.java:569) - Executing prepared SQL statement [UPDATE t_user u SET u.score = u.score + ? WHERE user_name =?]
(JdbcTemplate.java:819) - SQL update affected 0 rows
(AbstractPlatformTransactionManager.java:752) - Initiating transaction commit
(DataSourceTransactionManager.java:264) - Committing JDBC transaction on Connection [jdbc:mysql://localhost:3306/sampledb, UserName=root@localhost , MySQL-AB JDBC Driver]

?? 日志中紅色部分說明了MixLayerUserService#logon方法已經正確運行在事務上下文中。


轉載于:https://my.oschina.net/u/2317118/blog/610551

總結

以上是生活随笔為你收集整理的Spring的事务管理难点剖析:应用分层的迷惑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品女同一区二区三区 | 欧美性做爰大片免费 | 国产又粗又猛又爽69xx | 亚洲综合五月 | 深爱激情站 | 日韩欧美国产三级 | 天堂网www在线 | 亚洲19p| 精品人妻一区二区三区含羞草 | 成人免费做受小说 | 一级特黄色 | 婷婷综合国产 | 99热中文 | 爱逼av | 在线成人一区二区 | 伊人久久色 | 欧美色综合 | 中文字幕乱码在线观看 | 激情综合五月网 | 99热99re6国产在线播放 | 美女扒开尿口给男人捅 | 无码国产色欲xxxx视频 | 久久久久久9 | 久久精品无码中文字幕 | 中文在线一区二区三区 | 嫩草嫩草嫩草嫩草嫩草嫩草 | 女人洗澡一级特黄毛片 | 日本少妇bbb| 啪啪综合网 | 久久一区二区视频 | 久草av在线播放 | 国产精品久久久久久三级 | 久久久亚洲国产精品 | 好男人在线观看 | 欧美a在线视频 | 日韩夜夜操 | 色牛av | av精选| 亚洲a影院 | 日韩一区精品 | 欧美乱大交xxxxx春色视频 | 久久人 | 五月天精品在线 | 好吊操免费视频 | 波多野结衣免费视频观看 | 日日射av | 加勒比一区二区 | 四虎影院成人 | 国产精品99久久久久久www | 黄色特级毛片 | 精品人妻av一区二区三区 | 亚洲在线网站 | 日日骚av| 天天天干干干 | 亚洲午夜精品一区 | 成人av毛片| 成人黄色一级视频 | 成人免费视频观看视频 | 欧美性猛交aaaa片黑人 | 久久这里只有精品9 | 福利一区二区在线 | 国产又黄又粗又猛又爽 | 特级西西444www大精品视频免费看 | 亚色中文字幕 | 久久精品h | 色一情一伦一子一伦一区 | 无码国精品一区二区免费蜜桃 | 亚洲精品久久久久久国 | 美国一区二区三区 | 丰满人妻一区二区三区46 | 午夜福利视频一区二区 | 91 色| 97人妻精品视频一区 | 国产九色在线 | 韩国伦理片观看 | 在线观看精品 | 少妇一区二区三区 | 亚洲午夜久久久久 | 91抖音在线观看 | 中文字幕+乱码+中文字幕明步 | 99久久久无码国产 | 韩国三级做爰视频 | 97超视频在线观看 | 久久影视大全 | 福利视频99 | 亚洲wwww| 日韩福利在线观看 | 毛片久久久久久久 | 91精品国产aⅴ一区 黄色a网 | 午夜视频在线观看一区 | 国产一区二区三区在线播放无 | 亚洲精品 欧美 | 毛片av在线 | 日韩午夜精品视频 | 久久中文字幕一区 | 久久亚洲热 | 亚洲综合图片区 | 老女人毛片 | 亚洲a√ |