`

spring+springMVC,声明式事务失效,原因以及解决办法

阅读更多

一.声明式事务配置:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
 
  1.   

 

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
 
  1. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  2.     <property name="dataSource" ref="dataSource" />  
  3. </bean>  
  4.    <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  5.    <tx:attributes>  
  6.          <tx:method name="add*" propagation="REQUIRED" read-only="false"/>  
  7.          <tx:method name="del*" propagation="REQUIRED" read-only="false"/>  
  8.          <tx:method name="get*" propagation="REQUIRED" read-only="true"/>  
  9.          <tx:method name="mod*" propagation="REQUIRED" read-only="false" />            
  10.    </tx:attributes>  
  11.    </tx:advice>  
  12.    <aop:config>     
  13.     <aop:pointcut id="serviceMethods" expression="execution(public * com.lexing.platform.service.*.*(..))" />  
  14.     <aop:advisor  advice-ref="txAdvice" pointcut-ref="serviceMethods"/>  
  15.    </aop:config>  


二.声明式事务失效,原因

 

 

根本原因:由子容器扫描装配了@Service 注解的实例。

spring的context是父子容器,由ServletContextListener 加载spring配置文件产生的是父容器,springMVC加载配置文件产生的是子容器,子容器对Controller进行扫描装配时装配了@Service注解的实例 (@Controller 实例依赖@Service实例),而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。

三.解决办法

1.spring配置文件applicationContext中:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
 
  1. <!-- 不扫描带有@Controller注解的类 ,让 springMVC 子容器加载。  
[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
 
  1. <context:component-scan base-package="com.lexing.platform">     
  2.     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>     
  3. </context:component-scan>    

 

 

2.springMVC配置文件 servlet-context.xml中

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
 
  1. <!-- 将 带有 @Service注解的类,交由spring 父容器实例化,[ @Service实例依赖@Repository实例,故spring父容器也会装配<span style="font-family: Arial, Helvetica, sans-serif;">@Repository 实例</span><span style="font-family: Arial, Helvetica, sans-serif;">]</span>  
[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
 
  1. <context:component-scan base-package="com.lexing.platform">     
  2.     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>     
  3. </context:component-scan>     
  4. 本文来源于:http://blog.csdn.net/z69183787/article/details/37819627
分享到:
评论

相关推荐

    Spring+SpringMVC配置事务管理无效原因及解决办法详解

    Spring+SpringMVC配置事务管理无效原因及解决办法详解 Spring 框架是 Java 企业级应用程序的核心框架,提供了事务管理机制,以确保业务逻辑的原子性和一致性。然而,在使用 Spring 和 SpringMVC 配置事务管理时,...

    声明式事务失效的方法

    声明式事务失效的方法 在 Spring 框架中,声明式事务是指通过配置文件或注解来定义事务边界的方式。这种方式可以使得事务管理变得更加灵活和可靠。但是,在使用 Spring+SpringMVC 组合开发时,声明式事务可能会失效...

    16.spring与springmvc常见面试题.docx

    "spring与springmvc常见面试题" Spring 是一个流行的 Java Web 应用框架,提供了 ...(不推荐使用)2、声明式事务,在配置文件中配置(推荐使用)声明式事务又分为两种:基于注解的声明式事务和基于 XML 的声明式事务。

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...

    springMVC AOP拦截拦截Controller等实现日志管理

    在Spring MVC中,AOP(面向切面编程)是一种强大的工具,可以让我们在不修改代码...综上所述,Spring MVC结合AOP为我们提供了一种优雅的方式,以声明式地管理和记录Controller层的日志,增强了系统的可观察性和稳定性。

    SSM中事务管理所需的jar包-aspectjweaver

    声明式事务管理更易于维护,只需在配置文件或注解中声明事务属性,而无需在业务代码中显式控制事务开始和结束。 2. **AspectJ**:AspectJ是一个强大的AOP框架,它允许开发者定义“切面”,即关注点的模块化,如日志...

    跳槽涨薪涨薪必备精选面试题.pdf

    Spring Cloud组件如Zuul(API网关)、Feign(声明式服务调用)等,与Dubbo相比更注重整体微服务生态。 以上只是部分面试题目的解析,实际面试中,面试官可能会结合具体项目经验和技术深度进行深入探讨。程序员在...

    (2024)跳槽涨薪必备精选面试题.pdf

    - Spring 使用 AOP 和声明式事务管理。 - 支持多种事务管理器,如 JTA、JDBC、Hibernate 等。 7. **Spring容器启动流程** - 加载配置文件。 - 创建 BeanFactory。 - 注册后处理器。 - 初始化 Bean。 8. **...

    java面试知识

    - **实现方式**:懒汉式、饿汉式、双重检查锁定等。 ##### 解析XML文件的几种技术 - **DOM (Document Object Model)**:将XML文档转化为树形结构。 - **SAX (Simple API for XML)**:基于事件驱动模型。 - **StAX ...

Global site tag (gtag.js) - Google Analytics