本身单独作了个小网站 可是发现action事务不起做用了 可是若是用service层就没问题 找了不少办法没解决 最后本身解决了程序员
其实就是一个加载顺序的问题web
首先使用了spring MVC的项目是不须要配置action bean 而是经过spring mvc的配置文件进行扫描注解加载的spring
spring事务配置文件还有上下文都是经过org.springframework.web.context.ContextLoaderListener加载的,编程
而spring MVC的action是经过org.springframework.web.servlet.DispatcherServlet加载的 mvc
这样就有个优先级的问题了 web是先启动ContextLoaderListener后启动DispatcherServletjsp
在ContextLoaderListener加载的时候action并没在容器中,因此如今使用AOP添加事务或者扫描注解都是无用的。网站
那么解决办法就是在DispatcherServlet 加载spring-MVC配置文件后再进行一次AOP事务扫描和注解事务扫描就OK了spa
<tx:annotation-driven transaction-manager="transactionManager"/> <aop:config> <aop:advisor advice-ref="transactionAdvice" pointcut="execution(* com.yang.web.*.action.*.*(..))"/> </aop:config>
至于为何要在Action中加事务code
spring in action 一书中也说过 service dao action 是很经典的组合但不是必须的,对于一个简单的增删改查系统,不必分那么多层,好比一个简单保存功能 无非就new 一个实体 映射参数 使用了spring jdbcTemplate 保存就一行代码 就一个这么简单的功能有必要 一个service接口 一个service实现类 一行代码调用一个dao接口一个dao实现类 要多建四个类 还要在spring上下文中配置 不累吗? 对于一个简单的系统而言这就是为本身找不自在 明明盖的是民房 硬要打摩天大楼的地基 orm
另有一篇博客也是这样说的
http://elf8848.iteye.com/blog/875830
5、父子上下文(WebApplicationContext) 方法二激进型
方案二,激进型:
Java世界的“面向接口编程”的思想是正确的,但在增删改查为主业务的系统里,Dao层接口,Dao层实现类,Service层接口,Service层实现类,Action父类,Action。再加上众多的O(vopobo)和jsp页面。写一个小功能 七、8个类就写出来了。 开发者说我就是想接点私活儿,和PHP,ASP抢抢饭碗,但我又是Java程序员。最好的结果是大项目能作好,小项目能作快。因此“激进型”方案就出现了—–没有接口、没有Service层、还能够没有众多的O(vopobo)。那没有Service层事务控制在哪一层?只好上升的Action层。
本文不想说这是否是正确的思想,我想说的是Spring不会限制你这样作。
Java–大项目能作好–按传统方式作,规规矩矩的作,好扩展,好维护。
Java–小项目能作快–按激进方式作,一周时间就能够出一个版本,先上线接受市场(用户)的反馈,再改进,再反馈,时间就是生命(成本)。