spring知识回顾

嗯,又要开始......了

一、前言

1.1 Spring的概述
1.1.1 什么是Spring
  • Spring:SE/EE开发的一站式框架。
    • 一站式框架:有EE开发的每一层解决方案。
    • WEB层 :SpringMVC
    • Service层 :Spring的Bean管理,Spring声明式事务
    • DAO层 :Spring的Jdbc模板,Spring的ORM模块
1.1.2 为什么学习Spring
1.1.3 Spring的版本

Spring3.x、Spring4.x、Spring5.x

二、入门

2.1 Spring的入门(IOC)
2.1.1 什么是IOC
  • IOC: Inversion of Control(控制反转)。
  • 控制反转:将对象的创建权反转给(交给)Spring。
2.1.2 下载Spring的开发包

官网:http://spring.io/

2.1.3 解压Spring的开发包
  • docs :Spring的开发规范和API
  • libs :Spring的开发的jar和源码
  • schema :Spring的配置文件的约束
2.1.4 创建web项目,引入jar包

2.1.5 创建接口和类

  • 如果底层的实现切换了,需要修改源代码,能不能不修改程序源代码对程序进行扩展?


2.1.6 将实现类交给Spring管理

在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html


2.1.7 编写测试类
2.1.8 IOC和DI
  • IOC:控制反转,将对象的创建权反转给了Spring。
    • DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
  • 面向对象的时候
    • 依赖
  Class A{
  }

  Class B{
    public void xxx(A a){
    }
  }
  • 继承:is a
  Class A{
  }
  Class B extends A{
  }
  • 聚合:has a
3.1 Spring的工厂类
3.1.1 Spring工厂类的结构图
  • ApplicationContext继承BeanFactory。
3.1.2 新老版本工厂类
  1. BeanFactory:调用getBean的时候,才会生成类的实例。(老)
  2. ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。
    ApplicationContext有两个实现类
    ClassPathXmlApplicationContext :加载类路径下的配置文件
    FileSystemXmlApplicationContext :加载文件系统下的配置文件
4.1 Spring的配置
4.1.1 Bean的相关的配置
  1. <bean>标签的id和name的配置
  • id :使用了约束中的唯一约束。里面不能出现特殊字符的。
  • name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
    • Spring和Struts1框架整合的时候
    • <bean name=”/user” class=””/>
  1. Bean的生命周期的配置(了解)
  • init-method :Bean被初始化的时候执行的方法
  • destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
  1. Bean的作用范围的配置(重点)
  • scope :Bean的作用范围
    • singleton :默认的,Spring会采用单例模式创建这个对象。
    • prototype :多例模式。(Struts2和Spring整合一定会用到)
    • request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
    • session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
    • globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
4.2 Spring的Bean的管理(XML方式)
4.2.1 Spring的Bean的实例化方式

Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式

  1. 无参构造方法的方式(默认)



  2. 静态工厂实例化的方式



  3. 实例工厂实例化的方式



4.2.2 Spring的属性注入
  1. 构造方法的方式的属性注入


  2. Set方法的方式的属性注入



  3. P名称空间的属性的注入(Spring2.5以后)
  • 通过引入p名称空间完成属性的注入
    写法:
    普通属性 p:属性名=”值”
    对象属性 p:属性名-ref=”值”
  • p名称空间的引入


  • 使用p名称空间


  1. SpEL的属性注入(Spring3.0以后)
    SpEL:Spring Expression Language,Spring的表达式语言。
    语法:#{SpEL}


4.2.3 集合类型属性注入(了解)
<!-- Spring的集合属性的注入============================ -->
    <!-- 注入数组类型 -->
    <bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
        <!-- 数组类型 -->
        <property name="arrs">
            <list>
                <value>王东</value>
                <value>赵洪</value>
                <value>李冠希</value>
            </list>
        </property>
        
        <!-- 注入list集合 -->
        <property name="list">
            <list>
                <value>李兵</value>
                <value>赵如何</value>
                <value>邓凤</value>
            </list>
        </property>
        
        <!-- 注入set集合 -->
        <property name="set">
            <set>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </set>
        </property>
        
        <!-- 注入Map集合 -->
        <property name="map">
            <map>
                <entry key="aaa" value="111"/>
                <entry key="bbb" value="222"/>
                <entry key="ccc" value="333"/>
            </map>
        </property>
    </bean>

4.3 Spring的分模块开发的配置
4.3.1 在加载配置文件的时候,加载多个
4.3.2 在一个配置文件中引入多个配置文件

三、Spring IOC及AOP

3.1 Spring的IOC的注解开发
3.1.1 入门
  1. 创建web项目,引入jar包
  • 在Spring4的版本中,除了引入基本的开发包以外,还需要引入aop的包


  1. 引入Spring的配置文件
  • 在src下创建applicationContext.xml
    • 引入约束:使用注解开发引入context约束
    • 约束:spring-framework-4.2.4.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html


  1. 创建接口及实现类
  2. 开启Spring的组件扫描


  3. 在类上添加注解


  4. 编写测试类


  5. 注解方式设置属性的值
  • 注解方式
    :使用注解方式,可以没有set方法的。
    • 属性如果有set方法,需要将属性注入的注解添加到set方法
    • 属性如果没有set方法,需要将属性注入的注解添加属性上。


3.1.2 Spring的IOC的注解的详解
  1. @Component:组件
  • 修饰一个类,将这个类交给Spring管理
  • 这个注解有三个衍生注解(功能类似)
    • @Controller:web层
    • @Service:service层
    • @Repository:dao层
  1. 属性注入的注解
  • 普通属性:
    • @Value:设置普通属性的值。
  • 对象类型属性:
    • @Autowired:设置对象类型的属性的值。默认是按照类型完成属性注入(名称是谁无所谓)
      • 我们习惯是按照名称完成属性注入:必须让@Autowired注解和@Qualifier注解同时使用



  • @Resource:完成对象类型的属性的注入,按照名称完成属性注入。(默认是按照类型)


  1. Bean的其它的注解
  • 生命周期相关的注解(了解)
    • @PostConstruct:init-method
    • @PreDestroy:destroy-method
  • Bean作用范围的注解
    • @Scope:作用范围
      • singleton:默认单例
      • prototype:多例
      • request
      • session
      • globalsession
  1. XML和注解的比较
  • 适用场景
    • XML:可以使用任何场景
      • 结构清晰,维护方便
    • 注解:有些地方用不了,这个类不是自己提供的。
      • 开发方便。
  1. XML和注解整合开发
  • XML管理Bean,注解完成属性注入。
3.2 Spring的AOP的XML开发
3.2.1 AOP的概述
  1. 什么是AOP



    AOP:面向切面编程。AOP是OOP的扩展和延伸,解决OOP开发遇到的问题。

  2. Spring底层的AOP实现原理

  • 动态代理
    • JDK动态代理:只能对实现了接口的类产生代理。
    • Cglib动态代理(类似于Javascript第三方代理技术):对没有实现接口的类产生代理对象。生成子类对象。
3.2.2 Spring的AOP底层实现(了解)
  1. JDK动态代理



  2. Cglib动态代理



3.2.3 Spring的AOP的开发(AspectJ的XML的方式)
  1. Spring的AOP的简介
  • AOP思想最早是由AOP联盟组织提出的。Spring使用这种思想最好的框架
    • Spring的AOP有自己实现的方式(非常繁琐)。AspectJ是一个AOP的框架,Spring引入AspectJ作为自身AOP的开发。
    • Spring两套AOP开发方式
      • Spring传统方式(弃用)
      • Spring基于AspectJ的AOP开发(使用)
  1. AOP开发中相关术语:


3.2.4 Spring的AOP的入门(AspectJ的XML的方式)
  1. 创建web项目,引入jar包
  • 引入基本开发包
  • 引入aop开发相关jar包


  1. 引入Spring的配置文件
  • 引入aop的约束


  1. 编写目标类并完成配置


  2. 编写测试类:
  • Spring整合Junit单元测试


  1. 编写一个切面


  2. 将切面类交给Spring


  3. 通过AOP的配置实现


3.2.5 Spring中通知类型
  1. 前置通知:在目标方法执行之前进行操作
  • 前置通知:获得切入点信息



  1. 后置通知:在目标方法执行之后进行操作
  • 后置通知:获得方法的返回值。




  1. 环绕通知:在目标方法执行之前和之后进行操作



  • 环绕通知可以阻止目标方法的执行


  1. 异常抛出通知:在程序出现异常的时候,进行的操作



  2. 最终通知:无论代码是否有异常,总是会执行



  3. 引介通知(不用会)

3.2.6 Spring的切入点表达式写法:
  1. 切入点表达式语法:
  • 基于execution的函数完成的
  • 语法(public可省略)
    • [访问修饰符] 方法返回值 包名.类名.方法名(参数)
public void com.tong.spring.CustomerDao.save(..)
* *.*.*.*Dao.save(..)
* com.tong.spring.CustomerDao+.save(..) 当前类及其子类都可以
* com.tong.spring..*.*(..) 这个包及其子包下的所有类所有方法
3.3 Spring的AOP的基于AspectJ注解开发
3.3.1 Spring的基于ApsectJ的注解的AOP开发
  1. 创建项目,创建jar包


  2. 引入配置文件
  3. 编写目标类并配置


  4. 编写切面类并配置



  5. 使用注解的AOP对象目标类进行增强
  • 在配置文件中打开注解的AOP开发


  • 在切面类上使用注解


  1. 编写测试类


3.3.2 Spring的注解的AOP的通知类型
  1. @Before :前置通知


  2. @AfterReturning :后置通知


  3. @Around :环绕通知


  4. @AfterThrowing :异常抛出通知


  5. @After :最终通知


3.3.3 Spring的注解的AOP的切入点的配置


四、Spring JDBC模板及事务管理

4.1 Spring的JDBC的模板的使用
4.1.1 Spring的JDBC的模板

Spring是EE开发的一站式的框架,有EE开发的每层的解决方案。Spring对持久层也提供了解决方案:ORM模块和JDBC的模板。
Spring提供了很多的模板用于简化开发:


  1. JDBC模板使用的入门
  • 创建项目,引入jar包
  • 引入基本开发包:
  • 数据库驱动
  • Spring的JDBC模板的jar包


  1. 创建数据库和表
create database spring4_day03;
use spring4_day03;
create table account(
    id int primary key auto_increment,
    name varchar(20),
    money double
);

  1. 使用JDBC的模板:保存数据


4.1.2 将连接池和模板交给Spring管理
  1. 引入Spring的配置文件


  2. 使用Jdbc的模板

  • 引入spring_aop的jar包


4.1.3 使用开源的数据库连接池:
  1. DBCP的使用
  • 引入jar包


  • 配置DBCP连接池


  1. C3P0的使用
  • 引入c3p0连接池jar包


  • 配置c3p0连接池


4.1.4 抽取配置到属性文件
  1. 定义一个属性文件


  2. 在Spring的配置文件中引入属性文件
  • 第一种


  • 第二种(推荐,无需找类)


  1. 引入属性文件的值


  2. 测试


4.1.5 使用JDBC的模板完成CRUD的操作
  1. 保存操作


  2. 修改操作


  3. 删除操作


  4. 查询操作

  • 查询某个属性


  • 查询返回对象或集合


  • 数据封装


4.2 Spring的事务管理
4.2.1 事务的回顾
  1. 什么是事务
    事务:逻辑上的一组操作,组成这组操作的各个单元,要么全都成功,要么全都失败。
  2. 事务的特性
  • 原子性:事务不可分割
  • 一致性:事务执行前后数据完整性保持一致
  • 隔离性:一个事务的执行不应该受到其他事务的干扰
  • 持久性:一旦事务结束,数据就持久化到数据库
  1. 如果不考虑隔离性引发安全性问题
  • 读问题
    • 脏读 :一个事务读到另一个事务未提交的数据
    • 不可重复读 :一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
    • 虚读、幻读 :一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致。
  • 写问题
    • 丢失更新
  1. 解决读问题
    设置事务的隔离级别
  • Read uncommitted :未提交读,任何读问题解决不了。
  • Read committed :已提交读,解决脏读,但是不可重复读和虚读有可能发生。*
  • Repeatable read :重复读,解决脏读和不可重复读,但是虚读有可能发生。*
  • Serializable :解决所有读问题。
4.2.2 Spring的事务管理的API
  1. PlatformTransactionManager:平台事务管理器
    平台事务管理器:接口,是Spring用于管理事务的真正的对象。
  • DataSourceTransactionManager :底层使用JDBC管理事务
  • HibernateTransactionManager :底层使用Hibernate管理事务
  1. TransactionDefinition :事务定义信息
    事务定义:用于定义事务的相关的信息,隔离级别、超时信息、传播行为、是否只读
  2. TransactionStatus:事务的状态
    事务状态:用于记录在事务管理过程中,事务的状态的对象。
  3. 事务管理的API的关系:
    Spring进行事务管理的时候,首先平台事务管理器根据事务定义信息进行事务的管理,在事务管理过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。
4.2.3 Spring的事务的传播行为

Spring中提供了七种事务的传播行为:

  1. 保证多个操作在同一个事务中
  • PROPAGATION_REQUIRED :默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
  • PROPAGATION_SUPPORTS :支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
  • PROPAGATION_MANDATORY :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。
  1. 保证多个操作不在同一个事务中
  • PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
  • PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起。不使用事务管理。
  • PROPAGATION_NEVER :如果A中有事务,报异常。
  1. 嵌套式事务
  • PROPAGATION_NESTED :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。
4.2.4 Spring的事务管理
  1. 搭建Spring的事务管理的环境
  • 创建Service的接口和实现类


  • 创建Dao的接口和是实现类


  • 配置Service和DAO:交给Spring管理


  • 在DAO中编写扣钱和加钱方法:

    • 配置连接池和JDBC的模板


    • 在DAO注入JDBC的模板


  • 测试

4.2.5 Spring的事务管理:一类:编程式事务(需要手动编写代码)--了解
  1. 第一步:配置平台事务管理器


  2. 第二步:Spring提供了事务管理的模板类


  3. 第三步:在业务层注入事务管理的模板


  4. 编写事务管理的代码


  5. 测试

4.2.6 Spring的事务管理:二类:声明式事务管理(通过配置实现)---AOP
  1. XML方式的声明式事务管理
  • 第一步:引入aop的开发包

  • 第二步:恢复转账环境

  • 第三步:配置事务管理器


  • 第四步:配置增强


  • 第五步:AOP的配置


  • 测试

  1. 注解方式的声明式事务管理
  • 第一步:引入aop的开发包

  • 第二步:恢复转账环境

  • 第三步:配置事务管理器


  • 第四步:开启注解事务


  • 第五步:在业务层添加注解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,510评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,680评论 6 342
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,686评论 2 22
  • 关于手机 我在煮饭,哥哥进来找我谈话,问我为什么不能玩手机了,我说我曾经那么信任你们,制定了规则并把手机交给你们...
    我们伍阅读 257评论 0 0
  • 今天在餐厅包饺子,谷老师让包一元的钢镚到饺子里,我嫌太大,换成了两个一毛的硬币,结果谷老师说,太小了,再给咽下去!...
    IamCircle阅读 53评论 0 0