spring注解详解 transactional注解 做了哪些工作

umgsai 的BLOG
用户名:umgsai
文章数:386
评论数:68
访问量:90475
注册日期:
阅读量:5863
阅读量:12276
阅读量:395253
阅读量:1086038
51CTO推荐博文
事务,一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务应该具有4个属性:原子性、一致性、隔离性、持久性。原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。例如:在银行转账的时候,假设要从账户A转账100元到账户B,只允许两种情况发生:①转账成功,即账户A余额减少100并且账户B余额增加100 ②转账失败,即账户A的余额不变并且账户B的余额不变。 除了这两种情况之外的都绝对不允许发生。BookShopDao接口public&interface&BookShopDao&{
//根据书号获取书的单价
public&int&findBookPriceByIsbn(String&isbn);
//更新书的库存,使书号对应的库存-1
public&void&updateBookStock(String&isbn);
//更新用户的账户余额,是username的balance-price
public&void&updateUserAccount(String&username,&int&price);
}BookShopDao接口的实现类@Repository("bookShopDao")
public&class&BookShopImpl&implements&BookShopDao{
@Autowired
private&JdbcTemplate&jdbcT
public&int&findBookPriceByIsbn(String&isbn)&{
String&sql&=&"select&price&from&book&where&isbn&=&?";
return&jdbcTemplate.queryForObject(sql,&Integer.class,&isbn);
public&void&updateBookStock(String&isbn)&{
//检查书的库存是否足够,若不够,则抛异常
String&s&=&"select&stock&from&book_stock&where&isbn&=&?";
int&stock&=&jdbcTemplate.queryForObject(s,&Integer.class,&isbn);
//System.out.println("stock:"&+&stock);
if&(stock&&=&0)&{
throw&new&BookStockException("库存不足");
String&sql&=&"update&book_stock&set&stock&=&stock&-1&where&isbn&=&?";
jdbcTemplate.update(sql,&isbn);
public&void&updateUserAccount(String&username,&int&price)&{
//验证余额不否足够。若余额不足则抛出异常
String&s&=&"select&balance&from&account&where&username&=&?";
int&balance&=&jdbcTemplate.queryForObject(s,&Integer.class,&username);
if&(balance&&&price)&{
//System.out.println("余额不足");
throw&new&UserAccountException("余额不足");
String&sql&=&"update&account&set&balance&=&balance&-&?&where&username&=&?";
jdbcTemplate.update(sql,&price,&username);
}BookStockException.java和UserAccountException.java为自定义的两个异常类,继承RuntimeException。BookShopService接口public&interface&BookShopService&{
public&void&purchase(String&username,&String&isbn);
}BookShopService接口的实现类@Service("bookShopService")
public&class&BookShopServiceImpl&implements&BookShopService{
@Autowired
private&BookShopDao&bookShopD
//添加事务注解。
//当用户的账户余额不足并且书的库存足够多的时候,
//在执行findBookPriceByIsbn的时候不会抛出异常,在执行updateBookStock的时候也不会抛出异常。
//而在执行updateUserAccount的时候会抛出“余额不足”的异常。
//显然这次购买是不成功的。如果没有声明式事务,则书的库存会-1.显然这样是有问题的。
//添加了声明式事务之后,下面的三个方法要么都执行成功,否则都不会对数据库进行操作。
//这样就能保证数据的正确性。
@Transactional
public&void&purchase(String&username,&String&isbn)&{
//获取书的单价
int&price&=&bookShopDao.findBookPriceByIsbn(isbn);
//更新书的库存
bookShopDao.updateBookStock(isbn);
//更新用户余额
bookShopDao.updateUserAccount(username,&price);
}applicationContext.xml配置 &!--&配置Spring的JdbcTemplate&--&
&bean&id="jdbcTemplate"&class="org.springframework.jdbc.core.JdbcTemplate"&
&property&name="dataSource"&ref="dataSource"&&/property&
&!--&配置事务管理器&--&
&bean&id="tansactionManager"&class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&property&name="dataSource"&ref="dataSource"&&/property&
&!--&启用事务注解&--&
&tx:annotation-driven&transaction-manager="tansactionManager"/&测试 private&BookShopService&bookShopService&=&
applicationContext&=&new&ClassPathXmlApplicationContext("applicationContext.xml");
bookShopService&=&applicationContext.getBean(BookShopService.class);
public&void&testBookShopService()&{
bookShopService.purchase("umgsai",&"1001");
}事务的传播行为及事务的注解配置定义接口CashierImpl.java及实现类。实现类如下。@Service("cashier")
public&class&CashierImpl&implements&Cashier&{
@Autowired
private&BookShopService&bookShopS
@Transactional
public&void&checkout(String&username,&List&String&&isbns)&{
for&(String&isbn&:&isbns)&{
bookShopService.purchase(username,&isbn);
}BookShopServiceImpl实现类@Service("bookShopService")
public&class&BookShopServiceImpl&implements&BookShopService{
@Autowired
private&BookShopDao&bookShopD
/**添加事务注解。假设A方法调用purchase方法。
*1.使用propagation指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时
*如何使用事务,默认取值为REQUIRED,即使用A方法的事务。
*REQUIRES_NEW:使用purchase方法自己的事务,A方法的事务会被挂起。
*2.使用isolation指定事务的隔离级别,最常用的取值为READ_COMMITTED。
*3.默认情况下Spring的声明式事务对所有的运行时异常进行回滚。也可以通过对应的属性进行设置。
&*noRollbackFor={UserAccountException.class}&&指定对于UserAccountException异常不回滚。
&*通常情况下回滚属性取默认值即可。
&*4.使用readOnly指定事务是否只读。表示这个事务只读取事务不更新事务,帮助数据库引擎优化事务。
&*如果是一个只读取数据库数据的方法应设置readOnly=true。
&*5.使用timeout指定强制回滚之前事务可以占用的时间。单位为秒。如果超时则会强制回滚。
@Transactional(propagation=Propagation.REQUIRES_NEW,
isolation=Isolation.READ_COMMITTED
public&void&purchase(String&username,&String&isbn)&{
Thread.sleep(5000);
}&catch&(InterruptedException&e)&{
e.printStackTrace();
//获取书的单价
int&price&=&bookShopDao.findBookPriceByIsbn(isbn);
//更新书的库存
bookShopDao.updateBookStock(isbn);
//更新用户余额
bookShopDao.updateUserAccount(username,&price);
}测试方法 @Test
public&void&testTransactionalPropagation()&{
cashier.checkout("umgsai",&Arrays.asList("1001",&"1002"));
}源码&& 提取码 05c0推荐在eclipse中安装spring插件&&提取码 744b本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)[架构设计] spring,mybatis事务管理配置与@Transactional注解使用 | IT知识库
-& 正文阅读
[架构设计]spring,mybatis事务管理配置与@Transactional注解使用
spring,mybatis事务管理配置与@Transactional注解使用
概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)
支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用
提供比其他事务API如JTA更简单的编程式事务管理API
与spring数据访问抽象的完美集成事务管理方式spring支持编程式事务管理和声明式事务管理两种方式。编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。自动提交(AutoCommit)与连接关闭时的是否自动提交自动提交默认情况下,数据库处于自动提交模式。每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成功则隐式的提交事务,如果执行失败则隐式的回滚事务。对于正常的事务管理,是一组相关的操作处于一个事务之中,因此必须关闭数据库的自动提交模式。不过,这个我们不用担心,spring会将底层连接的自动提交特性设置为false。org/springframework/jdbc/datasource/DataSourceTransactionManager.java
// switch to manual commit if necessary. this is very expensive in some jdbc drivers,
// so we don't want to do it unnecessarily (for example if we've explicitly
// configured the connection pool to set it already).
if (con.getautocommit()) {
&&&&txobject.setmustrestoreautocommit(true);
&&&&if (logger.isdebugenabled()) {
&&&&&&&&logger.debug("switching jdbc connection [" + con + "] to manual commit");
&&&&con.setautocommit(false);
有些数据连接池提供了关闭事务自动提交的设置,最好在设置连接池时就将其关闭。但C3P0没有提供这一特性,只能依靠spring来设置。因为JDBC规范规定,当连接对象建立时应该处于自动提交模式,这是跨DBMS的缺省值,如果需要,必须显式的关闭自动提交。C3P0遵守这一规范,让客户代码来显式的设置需要的提交模式。连接关闭时的是否自动提交当一个连接关闭时,如果有未提交的事务应该如何处理?JDBC规范没有提及,C3P0默认的策略是回滚任何未提交的事务。这是一个正确的策略,但JDBC驱动提供商之间对此问题并没有达成一致。C3P0的autoCommitOnClose属性默认是false,没有十分必要不要动它。或者可以显式的设置此属性为false,这样会更明确。基于注解的声明式事务管理配置spring-servlet.xml
&!-- transaction support--&
&!-- PlatformTransactionMnager --&
&bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&&&&&property name="dataSource" ref="dataSource" /&
&!-- enable transaction annotation support --&
&tx:annotation-driven transaction-manager="txManager" /&
还要在spring-servlet.xml中添加tx名字空间
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
MyBatis自动参与到spring事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可,否则事务管理会不起作用。另外需要下载依赖包aopalliance.jar放置到WEB-INF/lib目录下。否则spring初始化时会报异常java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptorspring事务特性spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口
public interface PlatformTransactionManager {
&&TransactionStatus getTransaction(TransactionDefinition definition)
&&&&throws TransactionE
&&void commit(TransactionStatus status) throws TransactionE
&&void rollback(TransactionStatus status) throws TransactionE
其中TransactionDefinition接口定义以下特性:事务隔离级别隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量:TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。
TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。事务传播行为所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。事务超时所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。事务只读属性只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候。默认为读写事务。spring事务回滚规则指示spring事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常,然后依据规则决定是否回滚抛出异常的事务。默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。可以明确的配置在抛出那些异常时回滚事务,包括checked异常。也可以明确定义那些异常抛出时不回滚事务。还可以编程性的通过setRollbackOnly()方法来指示一个事务必须回滚,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。@Transactional注解@Transactional属性&
属性类型描述
可选的限定描述符,指定使用的事务管理器
propagation
enum: Propagation
可选的事务传播行为设置
enum: Isolation
可选的事务隔离级别设置
读写或只读事务,默认读写
int (in seconds granularity)
事务超时时间设置
rollbackFor
Class对象数组,必须继承自Throwable
导致事务回滚的异常类数组
rollbackForClassName
类名数组,必须继承自Throwable
导致事务回滚的异常类名字数组
noRollbackFor
Class对象数组,必须继承自Throwable
不会导致事务回滚的异常类数组
noRollbackForClassName
类名数组,必须继承自Throwable
不会导致事务回滚的异常类名字数组用法@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。
@Transactional(readOnly = true)
public class DefaultFooService implements FooService {
&&public Foo getFoo(String fooName) {
&&&&// do something
&&// these settings have precedence for this method
&&//方法上注解属性会覆盖类注解上的相同属性
&&@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
&&public void updateFoo(Foo foo) {
&&&&// do something
》》源码地址获取springmvc + mybatis整合详细,及遇到的问题请参看以下资料:参考资料:http://www.springmvc,net/detail/6074493.htmlhttp://my.oschina.net/wangbiglei/blog/489583http://my.oschina.net/wangbiglei/blog/489604
加: 16:01:30&
更: 16:01:32&
&&网站联系: qq: email:&spring,mybatis事务管理配置与@Transactional注解使用[转]-学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
spring,mybatis事务管理配置与@Transactional注解使用[转]
来源:互联网 更新时间: 20:46:27 责任编辑:王亮字体:
默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。
事务只读属性
只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候。默认为读写事务。
spring事务回滚规则
指示spring事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常,然后依据规则决定是否回滚抛出异常的事务。
默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。可以明确的配置在抛出那些异常时回滚事务,包括checked异常。也可以明确定义那些异常抛出时不回滚事务。
还可以编程性的通过setRollbackOnly()方法来指示一个事务必须回滚,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。
@Transactional注解
@Transactional属性
属性类型描述
可选的限定描述符,指定使用的事务管理器
propagation
enum: Propagation
可选的事务传播行为设置
enum: Isolation
可选的事务隔离级别设置
读写或只读事务,默认读写
int (in seconds granularity)
事务超时时间设置
rollbackFor
Class对象数组,必须继承自Throwable
导致事务回滚的异常类数组
rollbackForClassName
类名数组,必须继承自Throwable
导致事务回滚的异常类名字数组
noRollbackFor
Class对象数组,必须继承自Throwable
不会导致事务回滚的异常类数组
noRollbackForClassName
类名数组,必须继承自Throwable
不会导致事务回滚的异常类名字数组
@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。
@Transactional(readOnly = true)
public class DefaultFooService implements FooService {
&&public Foo getFoo(String fooName) {
&&&&// do something
&&// these settings have precedence for this method
&&//方法上注解属性会覆盖类注解上的相同属性
&&@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
&&public void updateFoo(Foo foo) {
&&&&// do something
相关文章:
上一篇文章:下一篇文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 学网 版权所有
京ICP备号-1 京公网安备02号出处:http://blog.csdn.net
问题出现的场景:
在使用spring mvc时,我使用了@Service这样的注解, 发现使用注解@Transactional声明的事务不起作用。
我的配置如下:
&mvc:annotation-driven /&
&context:component-scan base-package=&org.test&/ &
&bean id=&txManager&
class=&org.springframework.jdbc.datasource.DataSourceTransactionManager&&
&property name=&dataSource& ref=&dataSource& /&
&tx:annotation-driven transaction-manager=&txManager& /&
component-scan和事务所在的上下文不一样,component-scan所在的配置是由servlet加载的,事务所在的配置文件是由Listener加载的。
我的解决方法:
安装下面的配置,在应用启动时,不让spring扫描到@Service注解的类
&context:component-scan base-package=&org.test& &
&context:exclude-filter type=&annotation&
expression=&org.springframework.stereotype.Service& /&
&/context:component-scan&
作者:LZW190 发表于 17:33:59
阅读:126 评论:0
相关 [spring mvc service] 推荐:
- CSDN博客架构设计推荐文章
Web层面的框架学习了三个Struts1和2,SpringMVC,那他们之间肯定存在一个优劣和适用的环境,Struts1和2的异同点我已经做过对比《
Struts1和Struts2》,这篇将对比下Struts2和SpringMVC的异同,下面数据基本来源于网络,本人是搜集整理所得,供大家参考. 一个项目使用什么样的技术,决定的因素很多,我所能想到的有:对系统的性能、开发的效率、团队学习的成本、业务场景等,下面尽量从这几个方面入手,来分析比较下他们之间存在的优劣.
- CSDN博客Web前端推荐文章
在使用spring mvc时,我使用了@Service这样的注解, 发现使用注解@Transactional声明的事务不起作用. component-scan和事务所在的上下文不一样,component-scan所在的配置是由servlet加载的,事务所在的配置文件是由Listener加载的. 安装下面的配置,在应用启动时,不让spring扫描到@Service注解的类.
- 编程语言 - ITeye博客
链接:/blog/1297746 (附源码). 链接:/blog/983801 . 链接:/xguo/p/3163519.html . 链接:/blog/947191 .
- CSDN博客推荐文章
springmvc 框架围绕DispatcherServlet这个核心展开,DispatcherServlet是Spring MVC的总控制,它负责截获请求并将其分派给相应的处理器处理. SpringMVC框架包括注解驱动控制器、请求及响应的信息处理、视图解析、本地化解析、上传文件解析、异常处理以及表单标签绑定等内容.
- 码蜂笔记
项目组用了 Spring MVC 进行开发,觉得对里面的使用方式不是很满意,就想,如果是我来搭建开发环境,我会怎么做. 下面就是我的想法,只关注于 MVC 的 View 层. 现在基本上都是用 ajax 来调用后台接口,拿到 json格式的数据再展示,有的人直接返回数据,却没有考虑异常的情况,我觉得返回的报文里必须包含表示可能的异常信息的数据和业务响应数据.
- Java译站
10年前我开始自己的职业生涯的时候,Struts还是市场上的主流标准. 然而多年过后,我发现Spring MVC已经越来越流行了. 对我而言这并不意外,因为它能和Spring容器无缝集成,同时它还提供了灵活性及扩展性. 从我迄今为止对Spring的经验来看,我发现有不少人在配置Spring的时候经常会犯一些常见的错误.
- 企业架构 - ITeye博客
大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了. Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀. 官方的下载网址是:
http://www.springsource.org/download
(本文使用是的Spring 3.0.5版本).
- 企业架构 - ITeye博客
Spring MVC Controller单例陷阱. 标签:Spring mvc. 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明. Spring MVC Controller默认是单例的:. 1、这个不用废话了,单例不用每次都new,当然快了. 2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例.
- 企业架构 - ITeye博客
一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理. Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度. Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器.
- 企业架构 - ITeye博客
如何在Spring MVC里面解决此问题(其它框架也一样,逻辑一样,思想一样,和具体框架没什么关系). 要解决重复提交,有很多办法,比如说在提交完成后redirect一下,也可以用本文提到的使用token的方法(我不使用redirect是因为那样解决不了ajax提交数据或者移动应用提交数据,另一个原因是现在比较通行的方法是使用token,像python里的django框架也是使用token来解决).
坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。

我要回帖

更多关于 spring transactional 的文章

 

随机推荐