spring mvc 给action添加事务不成功的原因
springspringMVCation事务管理
自己单独做了个小网站但是发现action事务不起作用了但是如果用service层就没问题找了很多办法没解决最后自己解决了
其实就是一个加载顺序的问题
首先使用了springMVC的项目是不需要配置actionbean而是通过springmvc的配置文件进行扫描注解加载的
spring事务配置文件还有上下文都是通过org.springframework.web.context.ContextLoaderListener加载的,
而springMVC的action是通过org.springframework.web.servlet.DispatcherServlet加载的
这样就有个优先级的问题了web是先启动ContextLoaderListener后启动DispatcherServlet
在ContextLoaderListener加载的时候action并没在容器中,所以现在使用AOP添加事务或者扫描注解都是无用的。
那么解决办法就是在DispatcherServlet加载spring-MVC配置文件后再进行一次AOP事务扫描和注解事务扫描就OK了
Xml代码收藏代码
<tx:annotation-driventransaction-manager="transactionManager"/>
<aop:config>
<aop:advisoradvice-ref="transactionAdvice"pointcut="execution(*com.yang.web.*.action.*.*(..))"/>
</aop:config>
至于为什么要在Action中加事务
springinaction一书中也说过servicedaoaction是很经典的组合但不是必须的,对于一个简单的增删改查系统,没必要分那么多层,比如一个简单保存功能无非就new一个实体映射参数使用了springjdbcTemplate保存就一行代码就一个这么简单的功能有必要一个service接口一个service实现类一行代码调用一个dao接口一个dao实现类要多建四个类还要在spring上下文中配置不累吗?对于一个简单的系统而言这就是为自己找不自在明明盖的是民房硬要打摩天大楼的地基
另有一篇博客也是这样说的
五、父子上下文(WebApplicationContext)方法二激进型
方案二,激进型:
Java世界的“面向接口编程”的思想是正确的,但在增删改查为主业务的系统里,Dao层接口,Dao层实现类,Service层接口,Service层实现类,Action父类,Action。再加上众多的O(vo\po\bo)和jsp页面。写一个小功能7、8个类就写出来了。开发者说我就是想接点私活儿,和PHP,ASP抢抢饭碗,但我又是Java程序员。最好的结果是大项目能做好,小项目能做快。所以“激进型”方案就出现了-----没有接口、没有Service层、还可以没有众多的O(vo\po\bo)。那没有Service层事务控制在哪一层?只好上升的Action层。
本文不想说这是不是正确的思想,我想说的是Spring不会限制你这样做。