[关闭]
@Beeder 2018-02-17T15:52:10.000000Z 字数 22183 阅读 583

Spring框架

javaWeb Spring


Spring框架的概述

    Spring是一个分层(分层架构)的JavaSE/EEfull-stack(一站式) 轻量级开源框架
    Spring的核心是控制反转(IoC)和面向切面(AOP)

Spring框架的特点

下载jar包

下载地址:http://repo.springsource.org/libs-release-local/org/springframework/spring

  1. //IOC功能
  2. //日志相关的jar包
  3. //路径:spring-framework-3.0.2.RELEASE-dependencies/org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1
  4. com.springsource.org.apache.commons.logging-1.1.1.jar
  5. //路径:pring-framework-3.0.2.RELEASE-dependencies\org.apache.log4j\com.springsource.org.apache.log4j\1.2.15
  6. com.springsource.org.apache.log4j-1.2.15.jar
  7. //spring相关核心jar包
  8. spring-beans-4.2.4.RELEASE.jar
  9. spring-context-4.2.4.RELEASE.jar
  10. spring-core-4.2.4.RELEASE.jar
  11. spring-expression-4.2.4.RELEASE.jar
  12. //AOP功能
  13. //spring的传统AOP的开发的包
  14. spring-aop-4.2.4.RELEASE.jar
  15. com.springsource.org.aopalliance-1.0.0.jar
  16. //aspectJ的开发包
  17. com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
  18. spring-aspects-4.2.4.RELEASE.jar
  19. //整合web项目需要jar包
  20. //监听ServerletContext创建时加载applicationContext.xml(避免每次获取bean都进行加载)
  21. spring-web-4.2.4.RELEASE.jar
  22. //注解方式需要jar包
  23. spring-aop-4.2.4.RELEASE.jar
  24. //整合单元测试需要jar包
  25. spring-test-4.2.4.RELEASE.jar
  26. //Spring的JDBC
  27. //mysql驱动包
  28. mysql-connector-java-5.1.7-bin.jar
  29. //Spring框架JDBC相关包
  30. spring-jdbc-4.2.4.RELEASE.jar
  31. spring-tx-4.2.4.RELEASE.jar
  32. //整合dbcp连接池需要jar包
  33. com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
  34. com.springsource.org.apache.commons.pool-1.5.3.jar
  35. //整合c3p0连接池需要jar包
  36. com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

配置文件

applicationContext.xml
命名可以改,默认为applicationContext.xml

    路径:src目录下

bean标签的配置

属性 功能 特点
id 唯一ID约束 必须以字母开始,不可用特殊字符
name 可做id(无id情况) 可出现特殊字符
class Bean对象的全路径
init-method bean被载入到容器时调init-method指定方法
destroy-method bean从容器中删除时调destroy-method指定方法 通常不会执行(执行前虚拟机就会关闭)

引入其他的配置文件

  1. //根目录:为src目录
  2. <import resource="applicationContext2.xml"/>

IOC(Inverse of Control:控制反转)

    IoC     -- Inverse of Control(控制反转)将对象的创建权反转给Spring

IOC功能演示

applicationContext.xml
命名可以改,默认为applicationContext.xml

    路径:src目录下
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. <!-- 使用bean标签 -->
  8. <bean id="userService" class="com.itheima.demo2.UserServiceImpl">
  9. <property name="name" value="小凤"/>
  10. </bean>
  11. </bean>

java类

  1. /**
  2. * 使用的是Spring框架的方式
  3. */
  4. @Test
  5. public void run2(){
  6. // 创建工厂,加载核心配置文件
  7. //加载applicationContext.xml时,xml中的bean对象就会创建
  8. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  9. // 从工厂中获取到对象
  10. UserServiceImpl usi = (UserServiceImpl) ac.getBean("userService");
  11. // 调用对象的方法执行
  12. usi.sayHello();
  13. }

依赖注入(DI)

    Dependency Injection(依赖注入):在Spring框架创建Bean对象时,动态的将依赖对象注入到Bean组件中

DI功能演示

applicationContext.xml
命名可以改,默认为applicationContext.xml

    路径:src目录下
  1. <bean id="us" class="com.itheima.demo1.UserServiceImpl">
  2. <!--property:通过UserServiceImpl提供的set方法将value赋值给属性(name值)-->
  3. <property name="uname" value="小风"/>
  4. </bean>
  5. <!-- customerDao:需要引用的java对象 -->
  6. <bean id="customerDao" class="com.itheima.demo3.CustomerDaoImpl"/>
  7. <!--ref:引用bean对象,customerService中需要定义customerDao并提供set方法-->
  8. <bean id="customerService" class="com.itheima.demo3.CustomerServiceImpl">
  9. <property name="customerDao" ref="customerDao"/>
  10. </bean>
  11. <!-- 构造方法的注入的方式 -->
  12. <bean id="car1" class="com.itheima.demo4.Car1">
  13. <!--constructor-arg:将参数引入构造方法-->
  14. <constructor-arg name="cname" value="奇瑞QQ"/>
  15. <constructor-arg name="price" value="25000"/>
  16. <!--根据构造方法参数下标位置引入值
  17. <constructor-arg index="0" value="囚车"/>
  18. <constructor-arg index="1" value="545000"/>
  19. -->
  20. </bean>
  21. <!-- 注入集合:java类中都需要定义属性并提供set方法-->
  22. <bean id="user" class="com.itheima.demo4.User">
  23. <!--注入数组-->
  24. <property name="arrs">
  25. <list>
  26. <value>哈哈</value>
  27. <value>呵呵</value>
  28. <value>嘿嘿</value>
  29. </list>
  30. </property>
  31. <!--注入list集合-->
  32. <property name="list">
  33. <list>
  34. <value>美美</value>
  35. <value>小凤</value>
  36. </list>
  37. </property>
  38. <!--注入map集合-->
  39. <property name="map">
  40. <map>
  41. <entry key="aaa" value="小苍"/>
  42. <entry key="bbb" value="小泽"/>
  43. </map>
  44. </property>
  45. <!--注入Properties配置文件-->
  46. <property name="pro">
  47. <props>
  48. <prop key="username">root</prop>
  49. <prop key="password">1234</prop>
  50. </props>
  51. </property>
  52. </bean>

注解的方式

Bean管理的常用注解

IOC的注解方式

  1. @Component //作用在类上,相当于设置bean标签
  2. @PostConstruct //作用于init方法,相当于init-method属性
  3. @PreDestroy //作用于destroy方法,相当于destroy-method属性

IOC注解方式的依赖注入

    @Value          -- 用于注入普通类型

基本操作

导入jar包
  1. spring-aop-4.2.4.RELEASE.jar
开启注解扫描

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
  7. <!--需要引入context约束-->
  8. <!-- 开启注解的扫描 -->
  9. <context:component-scan base-package="com.itheima"/>
  10. </beans>

IOC的注解方式

    <bean id="userService" class="com.itheima.demo1.UserServiceImpl"> == @Component(value="userService")

bean类

  1. /**
  2. * 组件注解,标记类
  3. * <bean id="userService" class="com.itheima.demo1.UserServiceImpl"> == @Component(value="userService")
  4. * @author Administrator
  5. */
  6. @Component(value="userService")
  7. public class UserServiceImpl implements UserService {
  8. public void sayHell() {
  9. System.out.println("hello Spring!!");
  10. }
  11. //相当于init-method="init"
  12. @PostConstruct
  13. public void init(){
  14. System.out.println("初始化...");
  15. }
  16. }

测试类

  1. /**
  2. * 注解的方式
  3. */
  4. @Test
  5. public void run2(){
  6. // 获取工厂,加载配置文件
  7. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  8. // 获取对象
  9. UserService us = (UserService) ac.getBean("userService");
  10. us.sayHell();
  11. }

IOC的注解方式的依赖注入

bean类

  1. @Component(value="userService")
  2. public class UserServiceImpl implements UserService {
  3. // 给name属性注入“美美”的字符串,setName方法可以省略不写
  4. @Value(value="美美")
  5. private String name;
  6. /*public void setName(String name) {
  7. this.name = name;
  8. }*/
  9. // @Autowired //按类型自动装配
  10. // @Qualifier(value="userDao") // 按名称注入
  11. // 是Java的注解,Spring框架支持该注解
  12. @Resource(name="userDao")
  13. private UserDao userDao;
  14. public void sayHell() {
  15. System.out.println("hello Spring!!"+name);
  16. userDao.save();
  17. }
  18. }

技术分析之web整合

    避免每次调用都加载applicationContext.xml

引入jar包

  1. //监听ServerletContext创建时加载applicationContext.xml(避免每次获取bean都进行加载)
  2. spring-web-4.2.4.RELEASE.jar

web.xml

  1. <!-- 配置WEB整合的监听器 -->
  2. <listener>
  3. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  4. </listener>
  5. <!-- 加载方式:默认只能加载WEB-INF目录下的配置文件,提供配置方式,加载src目录下 -->
  6. <context-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <!--根目录:src-->
  9. <param-value>classpath:applicationContext.xml</param-value>
  10. </context-param>

java类

  1. /*(普通)使用工厂的方式
  2. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. CustomerService cs = (CustomerService) ac.getBean("customerService");
  4. cs.save();
  5. */
  6. //避免每次调用都加载applicationContext.xml
  7. ServletContext servletContext = ServletActionContext.getServletContext();
  8. // 需要使用WEB的工厂的方式
  9. WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
  10. CustomerService cs = (CustomerService) context.getBean("customerService");
  11. cs.save();

技术分析之Spring框架整合Junit单元测试(方便测试)

导入相关jar

  1. //整合单元测试需要jar包
  2. spring-test-4.2.4.RELEASE.jar

java测试类

  1. //运行SpringJUnit4ClassRunner.class
  2. @RunWith(SpringJUnit4ClassRunner.class)
  3. //加载applicationContext.xml
  4. @ContextConfiguration("classpath:applicationContext.xml")
  5. public class Demo2 {
  6. @Resource(name="userService")
  7. private UserService UserService;
  8. @Test
  9. public void run1(){
  10. // 原来:获取工厂,加载配置文件,getBean()
  11. UserService.sayHell();
  12. }
  13. }

AOP技术(Aspect Oriented Programming:面向切面编程)

    学习原因:可以在不修改源代码的前提下,对程序进行增强

Spring框架的AOP的底层实现

基于JDK的动态代理

    必须是面向接口的,只有实现了具体接口的类才能生成代理对象

基于CGLIB动态代理

    对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式

AOP的相关术语

Spring-AOP术语.bmp

  1. //所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
  2. 1. Joinpoint(连接点)
  3. //所谓切入点是指我们要对哪些Joinpoint进行拦截的定义
  4. 2. Pointcut(切入点)
  5. //所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
  6. 3. Advice(通知/增强)
  7. //引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field
  8. 4. Introduction(引介)
  9. //代理的目标对象
  10. 5. Target(目标对象)
  11. //是指把增强应用到目标对象来创建新的代理对象的过程
  12. 6. Weaving(织入)
  13. //一个类被AOP织入增强后,就产生一个结果代理类
  14. 7. Proxy(代理)
  15. // 是切入点和通知的结合,以后咱们自己来编写和配置的
  16. 8. Aspect(切面)

AOP环境搭建

引入相关jar包

  1. //spring的传统AOP的开发的包
  2. spring-aop-4.2.4.RELEASE.jar
  3. com.springsource.org.aopalliance-1.0.0.jar
  4. //aspectJ的开发包
  5. com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
  6. spring-aspects-4.2.4.RELEASE.jar

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
  7. <!-- 配置客户的dao类 -->
  8. <bean id="customerDao" class="com.itheima.demo3.CustomerDaoImpl"/>
  9. <!-- 配置切面类:增强类,编写增强方法 -->
  10. <bean id="myAspectXml" class="com.itheima.demo3.MyAspectXml"/>
  11. <!-- 配置AOP -->
  12. <aop:config>
  13. <!-- 配置切面类:切入点 + 通知(类型) -->
  14. <aop:aspect ref="myAspectXml">
  15. <!-- 配置的前置通知,save方法执行之前,增强的方法会执行 -->
  16. <!-- 切入点的表达式:execution(public void com.itheima.demo3.CustomerDaoImpl.save()) -->
  17. <!--
  18. method:(通知)增强方法
  19. pointcut:(切入点)需要增强的方法
  20. -->
  21. <aop:before method="log" pointcut="execution(public void com.itheima.demo3.CustomerDaoImpl.save())"/>
  22. </aop:aspect>
  23. </aop:config>
  24. </beans>

CustomerDaoImpl.java

  1. //继承CustomerDao接口
  2. public class CustomerDaoImpl implements CustomerDao {
  3. public void save() {
  4. System.out.println("保存客户...");
  5. }
  6. public void update() {
  7. System.out.println("修改客户...");
  8. }
  9. }

测试类

  1. /**
  2. * 测试AOP功能
  3. */
  4. @RunWith(SpringJUnit4ClassRunner.class)
  5. @ContextConfiguration("classpath:applicationContext3.xml")
  6. public class Demo3 {
  7. @Resource(name="customerDao")
  8. private CustomerDao customerDao;
  9. @Test
  10. public void run1(){
  11. customerDao.save();
  12. // customerDao.update();
  13. }
  14. }

AOP的通知类型

  1. /*环绕通知需手动执行目标对象的方法*/
  2. /**
  3. * 环绕通知:方法执行之前和方法执行之后进行通知,默认的情况下,目标对象的方法不能执行的。需要手动让目标对象的方法执行
  4. */
  5. public void around(ProceedingJoinPoint joinPoint){
  6. //目标对象的方法前执行
  7. System.out.println("环绕通知1...");
  8. try {
  9. // 手动让目标对象的方法去执行
  10. joinPoint.proceed();
  11. } catch (Throwable e) {
  12. e.printStackTrace();
  13. }
  14. //目标对象的方法后执行
  15. System.out.println("环绕通知2...");
  16. }

AOP的注解方式

AOP的常用注解

通知类型

配置通用的切入点

基本操作

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx.xsd">
  15. <!-- 开启自动代理 -->
  16. <aop:aspectj-autoproxy/>
  17. <!-- 配置目标对象 -->
  18. <bean id="customerDao" class="com.itheima.demo1.CustomerDaoImpl"/>
  19. <!-- 配置切面类 -->
  20. <bean id="myAspectAnno" class="com.itheima.demo1.MyAspectAnno"/>
  21. </beans>

切面类

  1. /**
  2. * 注解方式的切面类
  3. * 相当于配置 <aop:aspect ref="">标签
  4. */
  5. @Aspect
  6. public class MyAspectAnno {
  7. /**
  8. * 通知类型:@Before前置通知(切入点的表达式)
  9. * 相当于配置<aop:before>标签
  10. */
  11. @Before(value="MyAspectAnno.fn()")
  12. public void log(){
  13. System.out.println("记录日志...");
  14. }
  15. }
  16. /**
  17. * 自动定义切入点 @Pointcut
  18. */
  19. @Pointcut(value="execution(public * com.itheima.demo1.CustomerDaoImpl.save())")
  20. public void fn(){}

Spring的JDBC

基本操作

导入相关jar包

  1. //mysql驱动包
  2. mysql-connector-java-5.1.7-bin.jar
  3. //Spring框架JDBC相关包
  4. spring-jdbc-4.2.4.RELEASE.jar
  5. spring-tx-4.2.4.RELEASE.jar
  6. //整合dbcp连接池需要jar包
  7. com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
  8. com.springsource.org.apache.commons.pool-1.5.3.jar
  9. //整合c3p0连接池需要jar包
  10. com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

配置文件

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx.xsd">
  15. <!-- 内置的连接池:先配置连接池(Spring自带模板类) -->
  16. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  17. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  18. <property name="url" value="jdbc:mysql:///spring_day03"/>
  19. <property name="username" value="root"/>
  20. <property name="password" value="root"/>
  21. </bean>
  22. <!--使用DBCP连接池:配置DBCP的连接池(只需引入jar和配置)
  23. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  24. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  25. <property name="url" value="jdbc:mysql:///spring_day03"/>
  26. <property name="username" value="root"/>
  27. <property name="password" value="root"/>
  28. </bean>
  29. -->
  30. <!--使用C3P0连接池:配置DBCP的连接池 (只需引入jar和配置)
  31. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  32. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  33. <property name="url" value="jdbc:mysql:///spring_day03"/>
  34. <property name="username" value="root"/>
  35. <property name="password" value="root"/>
  36. </bean>
  37. -->
  38. <!-- 配置JDBC的模板类 -->
  39. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  40. <property name="dataSource" ref="dataSource"/>
  41. </bean>
  42. </beans>

测试类

  1. /**
  2. * 测试JDBC的模板类,使用IOC的方式
  3. */
  4. @RunWith(SpringJUnit4ClassRunner.class)
  5. @ContextConfiguration("classpath:applicationContext.xml")
  6. public class Demo1_1 {
  7. @Resource(name="jdbcTemplate")
  8. private JdbcTemplate jdbcTemplate;
  9. @Test
  10. public void run1(){
  11. //操作数据库
  12. jdbcTemplate.update("insert into t_account values (null,?,?)", "小苍",10000);
  13. }
  14. /**
  15. * 测试查询:通过主键查询一条记录
  16. */
  17. @Test
  18. public void run4(){
  19. Account ac = jdbcTemplate.queryForObject("select * from t_account where id = ?", new BeanMapper(), 1);
  20. System.out.println(ac);
  21. }
  22. /**
  23. * 自己手动的来封装数据(一行一行封装数据)
  24. * Account:JavaBean类,用于封装数据
  25. */
  26. class BeanMapper implements RowMapper<Account>{
  27. public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
  28. Account ac = new Account();
  29. ac.setId(rs.getInt("id"));
  30. ac.setName(rs.getString("name"));
  31. ac.setMoney(rs.getDouble("money"));
  32. return ac;
  33. }
  34. }
  35. }

继承JdbcDaoSupport类优化JDBC

    JdbcDaoSupport类有定义jdbc模板类,且只需注入连接池对象便会创建模板类。可省略jdbc模板类

前端控制器模式

配置文件

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx.xsd">
  15. <!-- 内置的连接池:先配置连接池(Spring自带模板类) -->
  16. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  17. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  18. <property name="url" value="jdbc:mysql:///spring_day03"/>
  19. <property name="username" value="root"/>
  20. <property name="password" value="root"/>
  21. </bean>
  22. <!-- 配置JDBC的模板类 -->
  23. <!--
  24. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  25. <property name="dataSource" ref="dataSource"/>
  26. </bean>
  27. -->
  28. <bean id="accountDao" class="com.itheima.demo1.AccountDaoImpl">
  29. <!-- <property name="jdbcTemplate" ref="jdbcTemplate"/> -->
  30. <property name="dataSource" ref="dataSource"/>
  31. </bean>
  32. </beans>

事务管理

特性:原子性一致性隔离性持久性

    事务:指的是逻辑上一组操作,组成这个事务的各个执行单元,要么一起成功,要么一起失败!

Spring框架的事务管理相关的类和API

PlatformTransactionManager接口
TransactionDefinition接口

事务隔离级别的常量

  1. static int ISOLATION_DEFAULT //采用数据库的默认隔离级别
  2. static int ISOLATION_READ_UNCOMMITTED
  3. static int ISOLATION_READ_COMMITTED
  4. static int ISOLATION_REPEATABLE_READ
  5. static int ISOLATION_SERIALIZABLE

事务的传播行为常量
先解释什么是事务的传播行为:解决的是业务层之间的方法调用!!

  1. /*在同一个事务中*/
  2. //A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来.(保证A,B在同一个事务中),默认值!!
  3. PROPAGATION_REQUIRED(默认值)
  4. //A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务.
  5. PROPAGATION_SUPPORTS
  6. //A中有事务,使用A中的事务.如果A没有事务.抛出异常.
  7. PROPAGATION_MANDATORY
  8. /*不在同一个事务中*/
  9. //A中有事务,将A中的事务挂起.B创建一个新的事务.(保证A,B没有在一个事务中)
  10. PROPAGATION_REQUIRES_NEW(记)
  11. //A中有事务,将A中的事务挂起.
  12. PROPAGATION_NOT_SUPPORTED
  13. //A中有事务,抛出异常.
  14. PROPAGATION_NEVER
  15. //嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)
  16. PROPAGATION_NESTED(记)

声明式事务管理-xml的方式

xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx.xsd">
  15. <!-- 配置C3P0的连接池 -->
  16. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  17. <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  18. <property name="jdbcUrl" value="jdbc:mysql:///spring_day03"/>
  19. <property name="user" value="root"/>
  20. <property name="password" value="root"/>
  21. </bean>
  22. <!-- 配置平台事务管理器 -->
  23. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  24. <property name="dataSource" ref="dataSource"/>
  25. </bean>
  26. <!-- 声明式事务(采用XML配置文件的方式) -->
  27. <!-- 先配置通知 -->
  28. <tx:advice id="myAdvice" transaction-manager="transactionManager">
  29. <tx:attributes>
  30. <!-- 给方法设置数据库属性(隔离级别,传播行为) -->
  31. <tx:method name="pay" propagation="REQUIRED"/>
  32. </tx:attributes>
  33. </tx:advice>
  34. <!-- 配置AOP:如果是自己编写的AOP,使用aop:aspect配置,使用的是Spring框架提供的通知aop:advisor -->
  35. <aop:config>
  36. <!-- aop:advisor,是Spring框架提供的通知 -->
  37. <aop:advisor advice-ref="myAdvice" pointcut="execution(public * com.itheima.demo2.AccountServiceImpl.pay(..))"/>
  38. </aop:config>
  39. <!-- 配置业务层和持久层 -->
  40. <bean id="accountService" class="com.itheima.demo2.AccountServiceImpl">
  41. <property name="accountDao" ref="accountDao"/>
  42. </bean>
  43. <bean id="accountDao" class="com.itheima.demo2.AccountDaoImpl">
  44. <property name="dataSource" ref="dataSource"/>
  45. </bean>
  46. </beans>

业务层java类

  1. public class AccountServiceImpl implements AccountService {
  2. private AccountDao accountDao;
  3. public void setAccountDao(AccountDao accountDao) {
  4. this.accountDao = accountDao;
  5. }
  6. /**
  7. * 转账的方法
  8. */
  9. public void pay(final String out, final String in, final double money) {
  10. // 先扣钱
  11. accountDao.outMoney(out, money);
  12. // 加钱
  13. accountDao.inMoney(in, money);
  14. }
  15. }

声明式事务管理-注解的方式

xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx.xsd">
  15. <!-- 配置C3P0的连接池 -->
  16. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  17. <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  18. <property name="jdbcUrl" value="jdbc:mysql:///spring_day03"/>
  19. <property name="user" value="root"/>
  20. <property name="password" value="root"/>
  21. </bean>
  22. <!-- 配置平台事务管理器 -->
  23. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  24. <property name="dataSource" ref="dataSource"/>
  25. </bean>
  26. <!-- 开启事务的注解 -->
  27. <tx:annotation-driven transaction-manager="transactionManager"/>
  28. <!-- 配置业务层和持久层 -->
  29. <bean id="accountService" class="com.itheima.demo3.AccountServiceImpl">
  30. <property name="accountDao" ref="accountDao"/>
  31. </bean>
  32. <bean id="accountDao" class="com.itheima.demo3.AccountDaoImpl">
  33. <property name="dataSource" ref="dataSource"/>
  34. </bean>
  35. </beans>

业务层java类

  1. /**
  2. * Transactional类上添加了注解,类中的所有的方法全部都有事务
  3. * @author Administrator
  4. */
  5. @Transactional
  6. public class AccountServiceImpl implements AccountService {
  7. private AccountDao accountDao;
  8. public void setAccountDao(AccountDao accountDao) {
  9. this.accountDao = accountDao;
  10. }
  11. /**
  12. * 转账的方法
  13. */
  14. public void pay(final String out, final String in, final double money) {
  15. // 先扣钱
  16. accountDao.outMoney(out, money);
  17. // 模拟异常
  18. int a = 10/0;
  19. // 加钱
  20. accountDao.inMoney(in, money);
  21. }
  22. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注