如有一代表用户的域对象User:
package com.domain;
import java.io.Serializable;
public class User implements Serializable{
private int user_id;
private String user_name;
private String user_password;
private String user_desc;
....//省略set、get方法
}
User的数据库操作接口:
package com.dao;
import com.domain.User;
public interface UserDao {
public void addUser(User user);
}
有一继承Spring JDBC支持类的UserDao接口实现类,实现添加一个User的方法。它需要注入一个Spring JDBC模板类JdbcTemplate:
package com.dao.jdbc;
import com.domain.User;
import com.dao.UserDao;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class UserJdbcDao extends JdbcDaoSupport implements UserDao{
public void addUser(User user){
String SQL =
"INSERT INTO user(user_name,user_password,user_desc) VALUES(?,?,?)";
Object[] params = new Object[]{
user.getUser_name(),
user.getUser_password(),
user.getUser_desc()
} ;
this.getJdbcTemplate().update(SQL, params);
}
}
以上Dao层的类对应的Bean的基本配置文件app_dao.xml如下(数据源的属性放入了外部的资源文件"prop.properties"):
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:prop.properties"/>
</bean>
<!--数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--Spring JDBC模板Bean,它注入了上面的数据源-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--User数据操作的Bean声明,它注入了上面的Spring JDBC模板Bean:jdbcTemplate-->
<bean id="userJdbcDao"
class="com.dao.jdbc.UserJdbcDao">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
</beans>
这里我简单地模拟业务类(业务接口UserService省略):
package com.service.impl;
import com.dao.UserDao;
import com.domain.User;
import com.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void addUser(User user){
this.userDao.addUser(user);
}
}
为了在业务类中使用事务管理功能,有如下几个方法:
1、用原始的TransactionFactoryBean的app.xml基本配置:
<import resource="classpath:app_dao.xml"/><!--导入dao层的配置-->
<!--Spring JDBC的事务管理Bean,引入了DBCP数据源-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--业务类Bean-->
<bean id="userServiceImplTarget" class="com.service.impl.UserServiceImpl">
<property name="userDao" ref="userJdbcDao"/>
</bean>
<!--应用原始的TransactionFactoryBean进行事务管理Bean的声明-->
<bean id="userServiceImpl"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="txManager"/><!--指定事务管理bean-->
<property name="target" ref="userServiceImplTarget"/><!--指定业务bean-->
<property name="transactionAttributes"><!--事务的属性设置列表-->
<props>
<prop key="add*">PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE</prop>
<!--设置事务为只读时,添加数据将会产生异常-->
<!--<prop key="add*">PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE,readOnly</prop>-->
</props>
</property>
</bean>
测试:
......
UserServiceImpl usi = (UserServiceImpl)ctx.getBean("userServiceImpl");
......
2、用tx/aop命名空间配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans .....
xmlns:tx="http://www.springframework.org/schema/tx"
xsp:schemaLocation="http://www.springframework.org/schema/beans
...........
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<import resource="classpath:app_dao.xml"/>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userServiceImplTarget" class="com.service.impl.UserServiceImpl">
<property name="userDao" ref="userJdbcDao"/>
</bean>
<!--应用tx/aop命名空间进行事务声明-->
<!--用tx:advice声明具体方法的事务属性,及应用到的事务管理器-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--用aop:config声明要进行事务增强的切面-->
<aop:config>
<aop:pointcut id="serviceMethod"
expression="execution(* com.service..add*(..))"/>
<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>
</aop:config>
</beans>
测试:
.......
UserService usi = (UserService)ctx.getBean("userServiceImplTarget");
..........
3、使用@Transactional注解配置声明事务(最简单实用的方法):
在需要事务管理增强的业务类加入@Transactional注解标记,如:
......
import org.springframework.transaction.annotation.Transactional; //注解式事务
@Transactional(readOnly=false) //对业务类进行事务增强的标注
public class UserServiceImpl implements UserService {
...........
}
再在配置文件中用<tx:annotation-driven>驱动自动为标记@Transactional注解的类织入事务管理增强:
<import resource="classpath:app_dao.xml"/>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--注解式事务配置驱动-->
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
<!--业务类bean的实现类标注了@Transactional注解,所以会被
tx:annotation-driven注解驱动自动织入事务增强-->
<bean id="userService" class="com.service.impl.UserServiceImpl">
<property name="userDao" ref="userJdbcDao"/>
</bean>
测试:
.........
UserServiceImpl usi = (UserServiceImpl)ctx.getBean("userService");
.........
分享到:
相关推荐
在压缩包中的Spring事务管理练习,你可以尝试创建一个简单的示例,例如模拟两个银行账户转账的过程,通过开启事务确保转账的原子性,即转账操作要么全部成功,要么全部失败。这样可以帮助你更好地理解Spring事务管理...
2. **Spring事务管理**:Spring提供了两种事务管理方式,即编程式事务管理和声明式事务管理。编程式事务管理通过TransactionTemplate或直接调用PlatformTransactionManager接口的方法来管理事务,而声明式事务管理则...
Spring事务管理分为编程式事务管理和声明式事务管理两种方式。编程式事务管理通过使用PlatformTransactionManager接口的begin、commit、rollback等方法直接控制事务的生命周期,这种方式灵活但容易导致代码过于繁琐...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
除了异常外,方法的权限问题也会导致Spring事务管理失效。由于Java的继承机制,private、final、static修饰的方法不能被重写,因此这些方法不能被AOP代理。也就是说,这些修饰符的方法上不能直接使用@Transactional...
Spring事务管理主要包括两种类型:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编写代码来控制事务的开始、提交或回滚等操作。这种方式灵活度高,但会使得代码变得冗余且难以维护。 - **声明式...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。
在本文中,我们将深入探讨Spring框架中的事务管理。Spring是一个广泛应用的Java企业级应用开发框架,它提供...如果你想要深入了解,可以参考提供的博客链接或其他相关资料,进一步学习Spring事务管理的细节和最佳实践。
Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。其中声明式事务管理因其易于使用和维护而被广泛采用。 ##### 1.1 Spring声明式事务介绍 Spring的声明式事务管理是通过配置文件或注解的方式来实现...
你可以创建一个简单的 Spring 应用,配置事务管理器,并在业务层使用 @Transactional 注解或 TransactionTemplate 进行事务控制,以加深理解和应用。 总的来说,Spring 的事务管理机制提供了强大而灵活的支持,无论...
本文将深入探讨在Spring框架中如何管理事务,以“Spring 事务简单完整例子”为出发点,结合标签“spring,事务,jdbc事务”,我们将详细解释Spring事务管理的原理和实践。 首先,Spring提供了两种事务管理方式:编程...
Spring事务原理和配置 ...可是如果读者仔细研究了Spring事务管理的代码以后就会发现,事务管理其实也是如此简单的事情。这也印证了在本书开头,Spring事务管理的设计理念是:简洁、灵活、可扩展和可靠的。
- **Spring 事务管理**:Spring 提供了两种事务管理方式:编程式事务管理和声明式事务管理。声明式事务管理通常更受欢迎,因为它可以通过简单的配置实现,而无需编写额外的代码。 2. **Spring 自定义切面事务失效...
### Spring事务管理的方法 #### 一、引言 在企业级应用开发中,事务管理是一项至关重要的技术。Spring框架作为Java领域中一个非常流行的轻量级框架,为开发者提供了多种方式来实现事务管理,其中主要分为编程式...
Spring事务管理提供了一种声明式的方式来控制事务边界,使得开发者无需显式地调用开始、提交或回滚事务。 在Spring中,有以下两种事务管理方式: 1. **编程式事务管理**:开发者需要手动调用`...
#### 一、Spring事务管理概述 Spring框架为开发者提供了一套强大的事务管理机制,它简化了应用程序中的事务控制逻辑,使得开发人员能够更加专注于业务逻辑的编写,而不是繁琐的事务管理代码。Spring支持两种类型的...
### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要...通过了解这五种配置方式,开发者可以根据项目的实际情况选择最合适的方法来实现事务管理,从而提高系统的稳定性和可靠性。
Spring事务管理是Spring框架的核心特性之一,它提供了一种强大且灵活的方式来管理应用程序中的事务边界。在企业级Java应用中,事务处理是确保数据一致性、完整性和可靠性的关键部分。本篇文章将深入探讨Spring的事务...
这样,带有@Transactional注解的类或方法将会自动地被Spring事务代理处理。 3. **编程式事务管理** 编程式事务管理允许在代码中显式地开始、提交、回滚事务。使用PlatformTransactionManager接口的实现,如...