05Spring AOPçåºç¨é ç½®
1ãSpring JdbcTemplate
â å¨springä¸ä¸ºäºæ´å æ¹ä¾¿çæä½JDBCï¼å¨JDBCçåºç¡ä¹ä¸å®ä¹äºä¸ä¸ªæ½è±¡å±ï¼æ¤è®¾è®¡çç®çæ¯ä¸ºä¸åç±»åçJDBCæä½æä¾æ¨¡æ¿æ¹æ³ï¼æ¯ä¸ªæ¨¡æ¿æ¹æ³é½è½æ§å¶æ´ä¸ªè¿ç¨ï¼å¹¶å 许è¦çè¿ç¨ä¸çç¹å®ä»»å¡ï¼éè¿è¿ç§æ¹å¼ï¼å¯ä»¥å°½å¯è½ä¿ççµæ´»æ§ï¼å°æ°æ®åºååçå·¥ä½é讲å°æä½ã
1ãé 置并æµè¯æ°æ®æº
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mashibing</groupId>
<artifactId>spring_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
</project>
dbconfig.properties
jdbc.username=root123
password=123456
url=jdbc:mysql://localhost:3306/demo
driverClassName=com.mysql.jdbc.Driver
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
">
<context:property-placeholder location="classpath:dbconfig.properties"></context:property-placeholder>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
</bean>
</beans>
MyTest.java
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class);
System.out.println(dataSource);
System.out.println(dataSource.getConnection());
}
}
2ãç»spring容å¨æ·»å JdbcTemplate
â spring容å¨æä¾äºä¸ä¸ªJdbcTemplateç±»ï¼ç¨æ¥æ¹ä¾¿æä½æ°æ®åºã
1ãæ·»å pomä¾èµ
pom.xml
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
jdbcTemplate.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
">
<context:property-placeholder location="classpath:dbconfig.properties"></context:property-placeholder>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
</beans>
MyTest.java
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);
System.out.println(jdbcTemplate);
}
}
3ãæå ¥æ°æ®
MyTest.java
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);
String sql = "insert into emp(empno,ename) values(?,?)";
int result = jdbcTemplate.update(sql, 1111, "zhangsan");
System.out.println(result);
}
}
4ãæ¹éæå ¥æ°æ®
MyTest.java
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);
String sql = "insert into emp(empno,ename) values(?,?)";
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[]{1,"zhangsan1"});
list.add(new Object[]{2,"zhangsan2"});
list.add(new Object[]{3,"zhangsan3"});
int[] result = jdbcTemplate.batchUpdate(sql, list);
for (int i : result) {
System.out.println(i);
}
}
}
5ãæ¥è¯¢æ个å¼ï¼å¹¶ä»¥å¯¹è±¡çæ¹å¼è¿å
MyTest.java
import com.mashibing.bean.Emp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);
String sql = "select * from emp where empno = ?";
Emp emp = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Emp.class), 7369);
System.out.println(emp);
}
}
6ãæ¥è¯¢è¿åéå对象
MyTest.java
import com.mashibing.bean.Emp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.SQLException;
import java.util.List;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);
String sql = "select * from emp where sal > ?";
List<Emp> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Emp.class), 1500);
for (Emp emp : query) {
System.out.println(emp);
}
}
}
7ãè¿åç»åå½æ°çå¼
MyTest.java
import com.mashibing.bean.Emp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.SQLException;
import java.util.List;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);
String sql = "select max(sal) from emp";
Double aDouble = jdbcTemplate.queryForObject(sql, Double.class);
System.out.println(aDouble);
}
}
8ã使ç¨å ·å¤å ·åå½æ°çJdbcTemplate
jdbcTemplate.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
">
<context:property-placeholder location="classpath:dbconfig.properties"></context:property-placeholder>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
</beans>
MyTest.java
import com.mashibing.bean.Emp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
NamedParameterJdbcTemplate jdbcTemplate = context.getBean("namedParameterJdbcTemplate", NamedParameterJdbcTemplate.class);
String sql = "insert into emp(empno,ename) values(:empno,:ename)";
Map<String,Object> map = new HashMap<>();
map.put("empno",2222);
map.put("ename","sili");
int update = jdbcTemplate.update(sql, map);
System.out.println(update);
}
}
9ãæ´åEmpDao
jdbcTemplate.xml
<context:component-scan base-package="com.mashibing"></context:component-scan>
EmpDao.java
package com.mashibing.dao;
import com.mashibing.bean.Emp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
public class EmpDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void save(Emp emp){
String sql = "insert into emp(empno,ename) values(?,?)";
int update = jdbcTemplate.update(sql, emp.getEmpno(), emp.getEname());
System.out.println(update);
}
}
MyTest.java
import com.mashibing.bean.Emp;
import com.mashibing.dao.EmpDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
EmpDao empDao = context.getBean("empDao", EmpDao.class);
empDao.save(new Emp(3333,"wangwu"));
}
}
2ã声æå¼äºå¡
1ãç¯å¢åå¤
tx.sql
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50528
Source Host : localhost:3306
Source Database : tx
Target Server Type : MYSQL
Target Server Version : 50528
File Encoding : 65001
Date: 2020-02-13 19:19:32
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `account`
-- ----------------------------
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`username` varchar(10) NOT NULL DEFAULT '',
`balance` double DEFAULT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO account VALUES ('lisi', '1000');
INSERT INTO account VALUES ('zhangsan', '1000');
-- ----------------------------
-- Table structure for `book`
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(10) NOT NULL,
`book_name` varchar(10) DEFAULT NULL,
`price` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO book VALUES ('1', '西游记', '100');
INSERT INTO book VALUES ('2', 'æ°´æµä¼ ', '100');
INSERT INTO book VALUES ('3', 'ä¸å½æ¼ä¹', '100');
INSERT INTO book VALUES ('4', '红楼梦', '100');
-- ----------------------------
-- Table structure for `book_stock`
-- ----------------------------
DROP TABLE IF EXISTS `book_stock`;
CREATE TABLE `book_stock` (
`id` int(255) NOT NULL DEFAULT '0',
`stock` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of book_stock
-- ----------------------------
INSERT INTO book_stock VALUES ('1', '1000');
INSERT INTO book_stock VALUES ('2', '1000');
INSERT INTO book_stock VALUES ('3', '1000');
INSERT INTO book_stock VALUES ('4', '1000');
BookDao.java
package com.mashibing.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class BookDao {
@Autowired
JdbcTemplate jdbcTemplate;
/**
* åå»æ个ç¨æ·çä½é¢
* @param userName
* @param price
*/
public void updateBalance(String userName,int price){
String sql = "update account set balance=balance-? where username=?";
jdbcTemplate.update(sql,price,userName);
}
/**
* æç
§å¾ä¹¦çidæ¥è·åå¾ä¹¦çä»·æ ¼
* @param id
* @return
*/
public int getPrice(int id){
String sql = "select price from book where id=?";
return jdbcTemplate.queryForObject(sql,Integer.class,id);
}
/**
* ååºåï¼åå»ææ¬ä¹¦çåºå
* @param id
*/
public void updateStock(int id){
String sql = "update book_stock set stock=stock-1 where id=?";
jdbcTemplate.update(sql,id);
}
}
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
public void checkout(String username,int id){
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
}
MyTest.java
import com.mashibing.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) throws SQLException {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
BookService bookService = context.getBean("bookService", BookService.class);
bookService.checkout("zhangsan","1");
}
}
æ»ç»ï¼å¨äºå¡æ§å¶æ¹é¢ï¼ä¸»è¦æ两个åç±»ï¼
ç¼ç¨å¼äºå¡ï¼å¨ä»£ç ä¸ç´æ¥å å ¥å¤çäºå¡çé»è¾ï¼å¯è½éè¦å¨ä»£ç ä¸æ¾å¼è°ç¨beginTransaction()ãcommit()ãrollback()çäºå¡ç®¡çç¸å ³çæ¹æ³
声æå¼äºå¡ï¼å¨æ¹æ³çå¤é¨æ·»å 注解æè ç´æ¥å¨é ç½®æ件ä¸å®ä¹ï¼å°äºå¡ç®¡ç代ç ä»ä¸å¡æ¹æ³ä¸å离åºæ¥ï¼ä»¥å£°æçæ¹å¼æ¥å®ç°äºå¡ç®¡çãspringçAOPæ°å¥½å¯ä»¥å®ææ¤åè½ï¼äºå¡ç®¡ç代ç çåºå®æ¨¡å¼ä½ä¸ºä¸ç§æ¨ªåå ³æ³¨ç¹ï¼éè¿AOPæ¹æ³æ¨¡ååï¼è¿èå®ç°å£°æå¼äºå¡ã
2ã声æå¼äºå¡çç®åé ç½®
â Springä»ä¸åçäºå¡ç®¡çAPIä¸æ½è±¡åºäºä¸æ´å¥äºå¡ç®¡çæºå¶ï¼è®©äºå¡ç®¡ç代ç ä»ç¹å®çäºå¡ææ¯ä¸ç¬ç«åºæ¥ãå¼å人åéè¿é ç½®çæ¹å¼è¿è¡äºå¡ç®¡çï¼èä¸å¿ äºè§£å ¶åºå±æ¯å¦ä½å®ç°çã
â Springçæ ¸å¿äºå¡ç®¡çæ½è±¡æ¯PlatformTransactionManagerãå®ä¸ºäºå¡ç®¡çå°è£ äºä¸ç»ç¬ç«äºææ¯çæ¹æ³ãæ 论使ç¨Springçåªç§äºå¡ç®¡ççç¥(ç¼ç¨å¼æ声æå¼)ï¼äºå¡ç®¡çå¨é½æ¯å¿ é¡»çã
â äºå¡ç®¡çå¨å¯ä»¥ä»¥æ®éçbeançå½¢å¼å£°æå¨Spring IOC容å¨ä¸ãä¸å¾æ¯springæä¾çäºå¡ç®¡çå¨Â
Â
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL6FlaNNzZU9EMZpnTzA3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2kzM3ITMzITM3EjMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1ãå¨é ç½®æ件ä¸æ·»å äºå¡ç®¡çå¨
jdbcTemplate.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd
">
<context:component-scan base-package="com.mashibing"></context:component-scan>
<context:property-placeholder location="classpath:dbconfig.properties"></context:property-placeholder>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
<!--äºå¡æ§å¶-->
<!--é
ç½®äºå¡ç®¡çå¨çbean-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--å¼å¯åºäºæ³¨è§£çäºå¡æ§å¶æ¨¡å¼ï¼ä¾èµtxå称空é´-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional
public void checkout(String username,int id){
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
}
3ãäºå¡é ç½®çå±æ§
â isolationï¼è®¾ç½®äºå¡çé离级å«
â propagationï¼äºå¡çä¼ æè¡ä¸º
â noRollbackForï¼é£äºå¼å¸¸äºå¡å¯ä»¥ä¸åæ»
â noRollbackForClassNameï¼å¡«åçåæ°æ¯å ¨ç±»å
â rollbackForï¼åªäºå¼å¸¸äºå¡éè¦åæ»
â rollbackForClassNameï¼å¡«åçåæ°æ¯å ¨ç±»å
â readOnlyï¼è®¾ç½®äºå¡æ¯å¦ä¸ºåªè¯»äºå¡
â timeoutï¼äºå¡è¶ åºæå®æ§è¡æ¶é¿åèªå¨ç»æ¢å¹¶åæ»,åä½æ¯ç§
4ãæµè¯è¶ æ¶å±æ§
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(timeout = 3)
public void checkout(String username,int id){
bookDao.updateStock(id);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
}
5ã设置äºå¡åªè¯»
â å¦æä½ ä¸æ¬¡æ§è¡åæ¡æ¥è¯¢è¯å¥ï¼å没æå¿ è¦å¯ç¨äºå¡æ¯æï¼æ°æ®åºé»è®¤æ¯æSQLæ§è¡æé´ç读ä¸è´æ§ï¼
â å¦æä½ ä¸æ¬¡æ§è¡å¤æ¡æ¥è¯¢è¯å¥ï¼ä¾å¦ç»è®¡æ¥è¯¢ï¼æ¥è¡¨æ¥è¯¢ï¼å¨è¿ç§åºæ¯ä¸ï¼å¤æ¡æ¥è¯¢SQLå¿ é¡»ä¿è¯æ´ä½ç读ä¸è´æ§ï¼å¦åï¼å¨åæ¡SQLæ¥è¯¢ä¹åï¼åæ¡SQLæ¥è¯¢ä¹åï¼æ°æ®è¢«å ¶ä»ç¨æ·æ¹åï¼å该次æ´ä½çç»è®¡æ¥è¯¢å°ä¼åºç°è¯»æ°æ®ä¸ä¸è´çç¶æï¼æ¤æ¶ï¼åºè¯¥å¯ç¨äºå¡æ¯æã
â 对äºåªè¯»æ¥è¯¢ï¼å¯ä»¥æå®äºå¡ç±»å为readonlyï¼å³åªè¯»äºå¡ãç±äºåªè¯»äºå¡ä¸åå¨æ°æ®çä¿®æ¹ï¼å æ¤æ°æ®åºå°ä¼ä¸ºåªè¯»äºå¡æä¾ä¸äºä¼åæ段
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(timeout = 3,readOnly = true)
public void checkout(String username,int id){
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
}
6ã设置åªäºå¼å¸¸ä¸åæ»
â 注æï¼è¿è¡æ¶å¼å¸¸é»è®¤åæ»ï¼ç¼è¯æ¶å¼å¸¸é»è®¤ä¸åæ»
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(timeout = 3,noRollbackFor = {ArithmeticException.class,NullPointerException.class})
public void checkout(String username,int id){
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
int i = 1/0;
}
@Transactional(timeout = 3,noRollbackForClassName = {"java.lang.ArithmeticException"})
public void checkout(String username,int id){
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
int i = 1/0;
}
}
7ã设置åªäºå¼å¸¸åæ»
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(timeout = 3,rollbackFor = {FileNotFoundException.class})
public void checkout(String username,int id) throws FileNotFoundException {
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
// int i = 1/0;
new FileInputStream("aaa.txt");
}
}
8ã设置é离级å«
åç§ï¼
- Isolation.SERIALIZABLE
- REPEATABLE_READ
- READ_COMMITTED
- READ_UNCOMMITTED
- DEFAULT
â é离级å«æ²¡ææ¥è§¦çåå¦å¯ä»¥çæä¹åçäºå¡è§é¢ï¼éé¢æ详ç»è®²è§£ï¼æ¤å¤ä¸åèµè¿°ã
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(timeout = 3,isolation = Isolation.READ_COMMITTED)
public void checkout(String username,int id) throws FileNotFoundException {
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
// int i = 1/0;
new FileInputStream("aaa.txt");
}
}
9ãäºå¡çä¼ æç¹æ§
äºå¡çä¼ æç¹æ§æçæ¯å½ä¸ä¸ªäºå¡æ¹æ³è¢«å¦ä¸ä¸ªäºå¡æ¹æ³è°ç¨æ¶ï¼è¿ä¸ªäºå¡æ¹æ³åºè¯¥å¦ä½è¿è¡ï¼
springçäºå¡ä¼ æè¡ä¸ºä¸å ±æ7ç§ï¼
Â
10ãæµè¯äºå¡çä¼ æç¹æ§
BookDao.java
package com.mashibing.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class BookDao {
@Autowired
JdbcTemplate jdbcTemplate;
/**
* åå»æ个ç¨æ·çä½é¢
* @param userName
* @param price
*/
public void updateBalance(String userName,int price){
String sql = "update account set balance=balance-? where username=?";
jdbcTemplate.update(sql,price,userName);
}
/**
* æç
§å¾ä¹¦çidæ¥è·åå¾ä¹¦çä»·æ ¼
* @param id
* @return
*/
public int getPrice(int id){
String sql = "select price from book where id=?";
return jdbcTemplate.queryForObject(sql,Integer.class,id);
}
/**
* ååºåï¼åå»ææ¬ä¹¦çåºå
* @param id
*/
public void updateStock(int id){
String sql = "update book_stock set stock=stock-1 where id=?";
jdbcTemplate.update(sql,id);
}
/**
* ä¿®æ¹å¾ä¹¦ä»·æ ¼
* @param id
* @param price
*/
public void updatePrice(int id,int price){
String sql = "update book set price=? where id =?";
jdbcTemplate.update(sql,price,id);
}
}
BookService.java
package com.mashibing.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(propagation = Propagation.REQUIRED)
public void checkout(String username,int id) {
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
@Transactional(propagation = Propagation.REQUIRED)
public void updatePrice(int id,int price){
bookDao.updatePrice(id,price);
int i = 1/0;
}
}
MulService.java
package com.mashibing.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MulService {
@Autowired
private BookService bookService;
@Transactional
public void mulTx(){
bookService.checkout("zhangsan",1);
bookService.updatePrice(1,1000);
}
}
MyTest.java
import com.mashibing.service.MulService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml");
MulService mulService = context.getBean("mulService", MulService.class);
mulService.mulTx();
}
}
â éè¿ä¸å¾çç»æåç°ï¼å¦æ设置çä¼ æç¹æ§æ¯Requiredï¼é£ä¹ææçäºå¡é½ä¼ç»ä¸æä¸ä¸ªäºå¡ï¼ä¸æ¦åçé误ï¼ææçæ°æ®é½è¦è¿è¡åæ»ã
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void checkout(String username,int id) {
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
@Transactional(propagation = Propagation.REQUIRED)
public void updatePrice(int id,int price){
bookDao.updatePrice(id,price);
int i = 1/0;
}
}
â éè¿ä¿®æ¹checkoutæ¹æ³çä¼ æç¹æ§ä¸ºRequired_new,åç°ä»·æ ¼è¿è¡äºåæ»ï¼èå ¶ä»çæ°æ®æ²¡æè¿è¡åæ»ã
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(propagation = Propagation.REQUIRED)
public void checkout(String username,int id) {
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
@Transactional(propagation = Propagation.REQUIRED)
public void updatePrice(int id,int price){
bookDao.updatePrice(id,price);
}
}
MulService.java
package com.mashibing.service;
import com.mashibing.bean.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MulService {
@Autowired
private BookService bookService;
@Transactional
public void mulTx(){
bookService.checkout("zhangsan",1);
bookService.updatePrice(1,1000);
int i = 1/0;
}
}
â å°bookserviceæ¹æ³çä¼ æè¡ä¸ºä¸ºRequiredï¼å¹¶ä¸å°æ¥é设置å¨MulServiceä¸ï¼åç°ä¼é½è¿è¡åæ»ã
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void checkout(String username,int id) {
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updatePrice(int id,int price){
bookDao.updatePrice(id,price);
}
}
MulService.java
package com.mashibing.service;
import com.mashibing.bean.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MulService {
@Autowired
private BookService bookService;
@Transactional
public void mulTx(){
bookService.checkout("zhangsan",1);
bookService.updatePrice(1,1000);
int i = 1/0;
}
}
â å°bookserviceæ¹æ³çä¼ æè¡ä¸ºä¸ºRequires_newï¼å¹¶ä¸å°æ¥é设置å¨MulServiceä¸ï¼åç°é½ä¸ä¼è¿è¡åæ»ã
BookService.java
package com.mashibing.service;
import com.mashibing.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@Service
public class BookService {
@Autowired
BookDao bookDao;
/**
* ç»è´¦ï¼ä¼ å
¥åªä¸ªç¨æ·ä¹°äºåªæ¬ä¹¦
* @param username
* @param id
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void checkout(String username,int id) {
bookDao.updateStock(id);
int price = bookDao.getPrice(id);
bookDao.updateBalance(username,price);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updatePrice(int id,int price){
bookDao.updatePrice(id,price);
}
@Transactional
public void mulTx(){
checkout("zhangsan",1);
updatePrice(1,1000);
int i = 1/0;
}
}
â å¦æå¨bookserviceæ§è¡çè¯ï¼ä¼åç°ååçææ就没æäºï¼åå æ¯å¤å±è°ç¨çæ¶å使ç¨çAOPï¼ä½æ¯æ¬ç±»æ¹æ³èªå·±çè°ç¨å°±æ¯æææ®éçè°ç¨ï¼å°±æ¯åä¸ä¸ªäºå¡ã
æ»ç»ï¼
注æé®é¢ï¼REQUIREDåNESTEDçåºå«ï¼
çèµ·æ¥ä¸¤ä¸ªä¼¼ä¹ä½ç¨æ¯ç¸åçï¼ä½æ¯REQUIREDä¼è·çç¶ä»»å¡ä¸åæ交ï¼ä¸å失败 ã èNESTEDæ¯ å¦æå½åäºå¡åºç°å¼å¸¸ï¼æ¬èº«è¿è¡åæ»æä½ï¼ä½æ¯ç¶ä»»å¡ä¸ä¼è¿è¡åæ»æä½ ï¼ä¸è¿å¦æç¶ä»»å¡åçå¼å¸¸ï¼åä»»å¡ä¼è¿è¡åæ»æä½ ã ï¼è§é¢ä¸è¿åç¥è¯ç¹æ¯é误çï¼å 为è¿ä¸¤ä¸ªäºå¡ä¼ æç¶ä»»å¡åçå¼å¸¸é½ä¼å½±ååä»»å¡è¿è¡åæ»æä½ï¼
1ãäºå¡ä¼ æ级å«æ¯REQUIREDï¼å½checkout()被è°ç¨æ¶ï¼åå®è¢«å¦ä¸ç±»ä¸commit()è°ç¨ï¼ï¼å¦æcheckout()ä¸ç代ç æåºå¼å¸¸ï¼å³ä¾¿è¢«æè·ï¼commit()ä¸çå ¶ä»ä»£ç é½ä¼roll back
2ãæ¯REQUIRES_NEWï¼å¦æcheckout()ä¸ç代ç æåºå¼å¸¸ï¼å¹¶ä¸è¢«æè·ï¼commit()ä¸çå ¶ä»ä»£ç ä¸ä¼roll backï¼å¦æcommit()ä¸çå ¶ä»ä»£ç æåºå¼å¸¸ï¼èä¸æ²¡ææè·ï¼ä¸ä¼å¯¼è´checkout()åæ»
3ãæ¯NESTEDï¼å¦æcheckout()ä¸ç代ç æåºå¼å¸¸ï¼å¹¶ä¸è¢«æè·ï¼commit()ä¸çå ¶ä»ä»£ç ä¸ä¼roll backï¼å¦æcommit()ä¸çå ¶ä»ä»£ç æåºå¼å¸¸ï¼èä¸æ²¡ææè·ï¼ä¼å¯¼è´checkout()åæ»
  PROPAGATION_REQUIRES_NEW å¯å¨ä¸ä¸ªæ°ç, ä¸ä¾èµäºç¯å¢ç "å é¨" äºå¡. è¿ä¸ªäºå¡å°è¢«å®å ¨ commited æ rolled back èä¸ä¾èµäºå¤é¨äºå¡, å®æ¥æèªå·±çé离èå´, èªå·±çé, çç. å½å é¨äºå¡å¼å§æ§è¡æ¶, å¤é¨äºå¡å°è¢«æèµ·, å å¡äºå¡ç»ææ¶, å¤é¨äºå¡å°ç»§ç»æ§è¡.Â
  å¦ä¸æ¹é¢, PROPAGATION_NESTED å¼å§ä¸ä¸ª "åµå¥ç" äºå¡,  å®æ¯å·²ç»åå¨äºå¡çä¸ä¸ªçæ£çåäºå¡. åµå¥äºå¡å¼å§æ§è¡æ¶,  å®å°åå¾ä¸ä¸ª savepoint. å¦æè¿ä¸ªåµå¥äºå¡å¤±è´¥, æ们å°åæ»å°æ¤ savepoint. æ½å¥äºå¡æ¯å¤é¨äºå¡çä¸é¨å, åªæå¤é¨äºå¡ç»æåå®æä¼è¢«æ交.Â
  ç±æ¤å¯è§, PROPAGATION_REQUIRES_NEW å PROPAGATION_NESTED çæ大åºå«å¨äº, PROPAGATION_REQUIRES_NEW å®å ¨æ¯ä¸ä¸ªæ°çäºå¡, è PROPAGATION_NESTED åæ¯å¤é¨äºå¡çåäºå¡, å¦æå¤é¨äºå¡ commit, åµå¥äºå¡ä¹ä¼è¢« commit, è¿ä¸ªè§ååæ ·éç¨äº roll back.Â
Â
3ãåºäºxmlçäºå¡é ç½®
jdbcTemplate.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd
">
<context:component-scan base-package="com.mashibing"></context:component-scan>
<context:property-placeholder location="classpath:dbconfig.properties"></context:property-placeholder>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
<!--äºå¡æ§å¶-->
<!--é
ç½®äºå¡ç®¡çå¨çbean-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--
åºäºxmlé
ç½®çäºå¡ï¼ä¾èµtxå称空é´åaopå称空é´
1ãspringä¸æä¾äºå¡ç®¡çå¨ï¼åé¢ï¼ï¼é
ç½®è¿ä¸ªäºå¡ç®¡çå¨
2ãé
ç½®åºäºå¡æ¹æ³
3ãåè¯springåªäºæ¹æ³æ¯äºå¡æ¹æ³ï¼äºå¡åé¢æç
§æ们çåå
¥ç¹è¡¨è¾¾å¼å»åå
¥äºå¡æ¹æ³ï¼
-->
<bean id="bookService" class="com.mashibing.service.BookService"></bean>
<aop:config>
<aop:pointcut id="txPoint" expression="execution(* com.mashibing.service.*.*(..))"/>
<!--äºå¡å»ºè®®ï¼advice-ref:æåäºå¡ç®¡çå¨çé
ç½®-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="txPoint"></aop:advisor>
</aop:config>
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<!--äºå¡å±æ§-->
<tx:attributes>
<!--ææåªäºæ¹æ³æ¯äºå¡æ¹æ³-->
<tx:method name="*"/>
<tx:method name="checkout" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
</beans>