exp:<aop:config/> 事务配置无效
2016-04-26 11:29
429 查看
配置如下:
事务管理表现为无效,同时还有一个非常奇怪的现象:如果将com.qyd.sms.service.api.student.service.StudentService这个类,以
不得其解,很幸运在网上找到了这个:spring+springMVC,声明
4000
式事务失效,原因以及解决办法,结合目前的情况(显式配置生效,注解不生效),以及这篇文章的内容,无效的原因应该是StudentService没有被spring加载,而是被springMVC加载,而srpingMVC加载时没有处理事务相关的部分,所以事务配置无效
有起色,去着重看一下项目的spring、springMVC的启动方式,
spring是通过ContextLoaderListener启动,springMVC通过DispatcherServlet启动,经过验证,spring 先于 springMVC 启动(暂时将ContextLoaderListener启动的部分称为spring,表示spring核心的部分,而springMVC则是处理请求的部分)
当前配置:spring启动配置了事务管理,没有配置自动扫描,springMVC配置了全局的自动扫描
事务无效的原因分析:
spring启动时能够拿到事务管理信息,但是由于没有配置扫描配置,所以看不到通过注解注册的StudentService,也就无法进行StudentService的事务相关的处理
等到springMVC启动时,可以注册StudentService,但是没有事务管理相关的配置,也就不会做事务相关的处理(tip:我不会尝试在springMVC中加入事务管理配置,去试一下是否事务能生效,因为即使能生效,也不会采用这种做法,理解即可)
所以 只要在spring启动时看到注册StudentService,就能够进行事务相关的处理,事务就能够生效,这也解释了为什么显式配置一个bean就可以生效,通常我们不会去显式配置每一个service,所以spring配置扫描即可解决该问题
我的解决方案:
springMVC:
spring:
配置文件如上,原因下面有说明。
说明:
经过测试,springMVC Controller的注册是不能放在spring启动时进行的,因为springMVC拿到注册的Controller信息后进行了的进一步处理,用于接收来访的请求
我更倾向于,spring,springMVC使用同一个bean容器,springMVC完全是基于spring来处理依赖注入的关系的,只不过springMVC做了额外的事
既然二者功能不同,对于配置文件的话,我比较倾向于根据功能完全分开,springMVC只负责了Controller层的注册的扫描,spring则负责其它所有。
<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="query*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- AOP切入点设置 --> <aop:config> <aop:pointcut id="dbService" expression="execution(* com.qyd.sms.service.api.student.service.StudentService.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="dbService" /> </aop:config>
事务管理表现为无效,同时还有一个非常奇怪的现象:如果将com.qyd.sms.service.api.student.service.StudentService这个类,以
<bean/>的形式显式的配置在配置文件中,事务管理就可以生效
不得其解,很幸运在网上找到了这个:spring+springMVC,声明
4000
式事务失效,原因以及解决办法,结合目前的情况(显式配置生效,注解不生效),以及这篇文章的内容,无效的原因应该是StudentService没有被spring加载,而是被springMVC加载,而srpingMVC加载时没有处理事务相关的部分,所以事务配置无效
有起色,去着重看一下项目的spring、springMVC的启动方式,
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/META-INF/spring/spring-beans.xml</param-value> </context-param> <servlet> <servlet-name>qyd-sms-servlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/META-INF/spring/spring-web.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>qyd-sms-servlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
spring是通过ContextLoaderListener启动,springMVC通过DispatcherServlet启动,经过验证,spring 先于 springMVC 启动(暂时将ContextLoaderListener启动的部分称为spring,表示spring核心的部分,而springMVC则是处理请求的部分)
当前配置:spring启动配置了事务管理,没有配置自动扫描,springMVC配置了全局的自动扫描
事务无效的原因分析:
spring启动时能够拿到事务管理信息,但是由于没有配置扫描配置,所以看不到通过注解注册的StudentService,也就无法进行StudentService的事务相关的处理
等到springMVC启动时,可以注册StudentService,但是没有事务管理相关的配置,也就不会做事务相关的处理(tip:我不会尝试在springMVC中加入事务管理配置,去试一下是否事务能生效,因为即使能生效,也不会采用这种做法,理解即可)
所以 只要在spring启动时看到注册StudentService,就能够进行事务相关的处理,事务就能够生效,这也解释了为什么显式配置一个bean就可以生效,通常我们不会去显式配置每一个service,所以spring配置扫描即可解决该问题
我的解决方案:
springMVC:
<mvc:annotation-driven/> <context:component-scan base-package="com.qyd.sms.controller" />
spring:
<context:component-scan base-package="com.qyd.sms" > <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
配置文件如上,原因下面有说明。
说明:
经过测试,springMVC Controller的注册是不能放在spring启动时进行的,因为springMVC拿到注册的Controller信息后进行了的进一步处理,用于接收来访的请求
我更倾向于,spring,springMVC使用同一个bean容器,springMVC完全是基于spring来处理依赖注入的关系的,只不过springMVC做了额外的事
既然二者功能不同,对于配置文件的话,我比较倾向于根据功能完全分开,springMVC只负责了Controller层的注册的扫描,spring则负责其它所有。
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 模拟Spring的简单实现
- Spring整合WebSocket应用示例(上)
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- springmvc 发送ajax出现中文乱码的解决方法汇总
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- Spring Bean基本管理实例详解
- java实现简单美女拼图游戏
- 详解Java的Spring框架中的事务管理方式
- 解析Java的Spring框架的BeanPostProcessor发布处理器