`

Spring配置事务在DAO层和业务逻辑层

阅读更多

Spring通过AOP实现声明式事务管理。通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Java对象的bean。当我们定义TransactionProxyFactoryBean时,必须提供一个相关的 PlatformTransactionManager的引用和事务属性。 事务属性含有上面描述的事务定义。

PlatformTransactionManager

HibernateTransactionManager需要一个SessionFactory的引用

JtaTransactionManager

一.把事务放置在了DAO层:

<!—hibernateTransactionManager-->

<bean id="transactionManager"

       class="org.springframework.orm.hibernate3.HibernateTransactionManager">

       <property name="sessionFactory">

              <ref local="sessionFactory" />

       </property>

</bean>

<!—DAO层接口实现-->

<bean id="companyDAOTarget"

       class="com.vstsoft.querycompany.dao.impl.CompanyDAOImpl">

       <property name="sessionFactory">

              <ref local="sessionFactory" />

       </property>

</bean>

<!—springDAO层的事务代理-->

<bean id="companyDAOProxy"

       class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

       <property name="transactionManager">

              <ref bean="transactionManager" />

       </property>

       <property name="target">

              <ref local="companyDAOTarget" />

       </property>

       <property name="transactionAttributes">

              <props>

              <prop key="insert*">PROPAGATION_REQUIRED</prop>

              <prop key="delete*">PROPAGATION_REQUIRED</prop>

              <prop key="find*">

              PROPAGATION_REQUIRED,readOnly

              </prop>

              </props>

       </property>

</bean>

<!—业务层接口实现,把DAO注入到Service里面-->

<bean name="companyManageTarget"

       class="com.vstsoft.querycompany.service.impl.CompanyManageTarget">

       <property name="companyDAO">

              <ref bean="companyDAOProxy" />

       </property>

</bean>

<!—springService层的代理-->

<bean id="companyManageProxy"

       class="org.springframework.aop.framework.ProxyFactoryBean">

       <property name="proxyInterfaces">

              <value>com.vstsoft.querycompany.service.CompanyManage</value>

       </property>

       <property name="target">

              <ref bean="companyManageTarget" />

       </property>

</bean>

<!—配置struts访问,把service层注入到action里面-->

<bean name="/company"

       class="com.vstsoft.querycompany.web.action.CompanyAction" singleton="false">

       <property name="companyManage">

              <ref local="companyManageProxy" />

       </property>

</bean>

二.把事务放置在了Service层:

<!—jtaTransactionManager-->

<bean id="jtaTransactionManager"

       class="org.springframework.transaction.jta.JtaTransactionManager" />

<!—DAO层接口实现-->

<bean id="companyDAOTarget"

       class="com.vstsoft.querycompany.dao.impl.CompanyDAOImpl">

       <property name="sessionFactory">

              <ref local="sessionFactory" />

       </property>

</bean>

<!—springDAO层的代理-->

<bean id="companyDAOProxy"

       class="org.springframework.aop.framework.ProxyFactoryBean">

       <property name="proxyInterfaces">

              <value>com.vstsoft.querycompany.dao.CompanyDAO</value>

       </property>

       <property name="target">

              <ref bean="companyDAOTarget" />

       </property>

</bean>

<!—业务层接口实现,把DAO注入到Service里面-->

<bean name="companyManageTarget"

       class="com.vstsoft.querycompany.service.impl.CompanyManageTarget">

       <property name="companyDAO">

              <ref bean="companyDAOProxy" />

       </property>

</bean>

<!—spring代理业务层的事务管理-->

<bean id="companyManageProxy"

       class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

       <property name="transactionManager">

              <ref local="jtaTransactionManager" />

       </property>

       <property name="transactionAttributes">

              <props>

                     <prop key="set*">PROPAGATION_REQUIRED</prop>

                     <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

              </props>

       </property>

       <property name="target">

              <ref bean="companyManageTarget" />

       </property>

</bean>

<!—配置struts访问,把service层注入到action里面-->

<bean name="/company"

       class="com.vstsoft.querycompany.web.action.CompanyAction" singleton="false">

       <property name="companyManage">

              <ref local="companyManageProxy" />

       </property>

</bean>

service层的接口实现CompanyManageImpl里面有个setData方法:按顺序执行数据查询,数据删除,数据插入数据库行为,如果哪一步出异常(运行时异常),事务回滚,只有所有行为都没成功,事务提交。

分享到:
评论

相关推荐

    spring配置在DAO和事务层(DOC)

    ### Spring配置在DAO和事务层知识点详解 #### 一、Spring框架中的事务管理机制 Spring 框架提供了强大的事务管理功能,支持多种事务管理方式,包括编程式事务管理和声明式事务管理。其中,声明式事务管理是通过...

    Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合

    2. **分层设计**:Spring框架支持分层的设计模式,这意味着不同的业务功能可以被封装在不同的层中,例如Web层负责处理用户界面,Service层处理业务逻辑,DAO层处理数据访问。这样的设计有助于保持代码的清晰度,并...

    spring几种Dao支持配置

    在Spring框架中,DAO(Data Access Object)层是应用程序与数据库交互的核心部分。Spring提供了多种方式来支持DAO的配置,使得开发人员可以灵活地选择最适合项目需求的数据访问策略。以下将详细阐述Spring对DAO支持...

    spring事务配置的五种方式

    ### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...

    spring boot服务器dao层实例化.rar_dao实例化_idea 实例ID_spring boot_spring b

    总之,Spring Boot通过其强大的自动配置和依赖注入机制,使得在IDEA中实例化和使用DAO层变得非常简单。开发者只需要关注业务逻辑,而无需过多关注底层的数据访问细节。这大大提高了开发效率,也使得代码更加模块化和...

    spring事务与数据库操作

    ### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...

    junit测试spring,hibernate的dao层代码

    首先,`DAO` 层是业务逻辑和数据库操作之间的隔离层,通常包含了增删改查等基本操作。在 `Spring` 框架中,`DAO` 类会被配置为 `Spring` 的bean,通过依赖注入来获取数据库连接或其他依赖。在测试 `DAO` 层时,我们...

    使用代理实现Hibernate Dao层自动事务

    5. 在业务层调用Dao的代理对象:在Service层或Controller层,注入Dao的代理对象,通过代理对象调用Dao的方法,Spring会自动处理事务的生命周期。 通过这样的方式,我们能够实现Hibernate Dao层的自动事务管理,让...

    spring声明式事务配置

    提供的XML配置示例展示了如何在Spring中配置声明式事务。具体来说,该示例包括以下几个关键组件: 1. **SessionFactory Bean**:用于配置Hibernate的SessionFactory实例,它是Hibernate的核心组件之一,负责创建...

    使用Spring实现DAO模式

    通过Spring框架实现DAO模式,不仅可以有效地分离业务逻辑和数据访问逻辑,还能借助Spring的事务管理和依赖注入等特性,大大提升代码的可维护性和扩展性。此外,结合AOP的使用,可以使代码更加清晰,减少冗余,提高...

    web应用dao层的开发经验小结

    在Web应用程序的开发中,DAO(Data Access Object)层是一个至关重要的部分,它负责与数据库进行交互,隔离业务逻辑和数据存储的细节。本篇文章将深入探讨DAO层的设计与实现经验,结合源码分析和实用工具,以提高...

    Spring3 JDBC 通用DAO封装2 dao层终于完成dao层大概上传完整代码

    DAO(Data Access Object)模式是一种常见的设计模式,用于隔离业务逻辑层与数据访问层。在Spring3中,我们可以通过接口定义通用的CRUD(Create, Read, Update, Delete)操作,然后创建一个实现该接口的抽象类,...

    ifunsu封装基于springjdbc的dao层api

    标题"ifunsu封装基于springjdbc的dao层api"指的是一个特定的项目或库,名为ifunsu,它已经对Spring JDBC进行了封装,以创建更易用的数据访问对象(DAO)层API。DAO层是应用程序中负责与数据库进行交互的部分,通常...

    DAO与三层结构

    - 示例代码展示,如如何创建DAO接口和实现类,以及如何在业务逻辑层中使用DAO - 关于事务管理在三层结构中的处理,如何在DAO中控制事务边界 `Base_DAO.rar`可能包含的资源有: - 基础DAO接口和实现类的源代码,例如...

    org.springframework.dao.InvalidDataAccessApiUsageException

    在Service层或具体的业务逻辑方法上添加 `@Transactional` 注解来管理事务。可以通过设置 `readOnly` 属性为 `false` 来显式地声明事务不是只读的,如下所示: ```java @Service public class UserServiceImpl ...

    Spring2.5实现事务管理(本地事务、分布式事务).doc

    Spring 2.5 实现事务管理(本地事务、分布式事务) Spring 框架提供了对事务管理的支持,它可以使得事务的管理变得更加简洁和灵活。...通过使用 Spring 的事务管理器和抽象的 DAO,可以实现灵活、可维护的业务逻辑。

    Struts2+hibernate+spring整合泛型DAO

    在Struts2+Hibernate+Spring的集成中,泛型DAO扮演着重要的角色,它使得DAO层对所有实体类的操作变得统一和规范。 首先,让我们详细了解一下Struts2。Struts2是基于拦截器的MVC框架,它提供了强大的动作映射、结果...

    spring-jdbc-dao

    在实际项目中,我们通常会创建一个UserDao接口,定义如getUserById()、saveUser()等方法,然后在配置文件中声明DataSource和JdbcTemplate,利用Spring的AOP功能实现DAO接口,以达到事务控制和异常处理。 总结,...

Global site tag (gtag.js) - Google Analytics