Spring

1.Spring简介

1.1 为什么要用spring

IOC解决高耦合,AOP解决代码冗余

为什么要用Spring?

  1. Spring提供一个容器/工厂,统一管理模块的定义,根据需要创建。
  2. 把模块的配置参数统一管理,模块不需要自行读取配置。
  3. Spring提供依赖注入,把依赖的模块自动推送进来,不需要模块自己拉取。
  4. 此外,Spring提供了对很多其他第三方框架的集成功能,能够便利开发(减少了样板代码(boilerplate) )。

1.2 Spring是容器还是工厂?(既是容器,又是工厂)

使用过Spring的同学都知道,”Spring是一个容器”。其实,这种说法不太准确,Spring提供的容器不止一种,例如有ClasspathXmlApplicationContext、XmlWebApplicationContext等多种容器,所有这些容器的父类都是BeanFactory。

但是为什么起名叫”工厂”呢?单纯的”容器”只起到一个存放对象的作用,如果只是想把对象存放起来,那么ArrayList,HashSet等Java集合类完全可以胜任,根本用不着Spring。Spring容器并不是单纯用于存放对象的,它存放对象定义(bean definition),而不止是存放对象(bean)。当需要一个对象时,我们从bean容器获取,而bean容器(BeanFactory)负责根据定义创建对象,所以说它是一个”工厂”。

**反过来,它又为什么叫做”容器”**?这是因为在大多数时候,bean都被定义为单例(singleton,与GoF中的singleton略有不同),且这些bean的类是Spring提供的ClassLoader加载的,单例的bean被实例化一次之后就一直保存在这个工厂中,以后每次请求获得这个bean都是同一个对象,相当于这个对象被放在BeanFactory中了,所以它又可以视为一个容器。

1.3 深入理解IOC和DI

什么是控制反转?

控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理

所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器

控制反转(IoC)有什么作用?

  • 管理对象的创建和依赖关系的维护。对象的创建并不是一件简单的事,在对象关系比较复杂时,如果依赖关系需要手动来维护的话,费时费力
  • 解耦,降低代码耦合度

什么是依赖注入

依赖注入(Depdendency Injection)和控制反转(IoC,Inversion of Control)

1.4 Spring中Bean的生命周期

这里我们说的 Spring Bean 的生命周期主要指的是 singleton bean,对于 prototype 的 bean ,Spring 在创建好交给使用者之后则不会再管理后续的生命周期。

我们也来复习下 Spring 中的 bean 的作用域有哪些?

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
  • session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。

我们知道对于普通的 Java 对象来说,它们的生命周期就是:

  • 实例化
  • 该对象不再被使用时通过垃圾回收机制进行回收

而对于 Spring Bean 的生命周期来说:

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction

实例化 -> 属性赋值 -> 初始化 -> 销毁

img

1.3 Spring可以做什么

1.4 Spring核心概念

1.5 Spring的模块

2.IOC

2.1 IOC提出背景

  • 代码书写现状:耦合度太高,我们修改一处代码,往往要修改很多出相关联的代码。

2.2 概念

控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理

所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器

2.3 IOC的作用

  • 依赖处理,通过依赖查找或者依赖注入
  • 管理托管的资源(Java Bean 或其他资源)的生命周期
  • 管理配置(容器配置、外部化配置、托管的资源的配置)

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI)装配对象、配置对象)并且管理这些对象的整个生命周期。

简单的来说就是:

我们自己new一个对象,可能会导致程序耦合度过高,后期可能维护不便。引入IOC,将创建对象的控制权交给Spring的IOC容器;如果要去使用对象,通过DI(依赖注入)@Autowired注解 自动注入,就可以使用对象了!

2.4 IOC的分类

DI 依赖注入不完全等同于IOC ,更应该说 DI 依赖注入是 IOC 的一种实现方式或策略

控制反转IoC是一个很大的概念,可以用不同方式来实现。依赖查找和依赖注入都是 IOC 的实现策略

依赖注入

相对于IoC而言,依赖注入(DI)更加准确地描述了IoC的设计理念。

所谓依赖注入(Dependency Injection),即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。

Spring框架使用这种方式。依赖注入是时下最流行的IoC实现方式,依赖注入分为接口注入(Interface Injection),Setter方法注入(Setter Injection)和构造器注入(Constructor Injection)三种方式。其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。

依赖注入的基本原则是:应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IoC容器负责。容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造器传递给需要的对象。

依赖注入之所以更流行是因为它是一种更可取的方式:让容器全权负责依赖查询,受管组件只需要暴露JavaBean的setter方法或者带参数的构造器或者接口,使容器可以在初始化时组装对象的依赖关系。其与依赖查找方式相比,主要优势为:

  • 查找定位操作与应用代码完全无关。
  • 不依赖于容器的API,可以很容易地在任何容器以外使用应用对象。
  • 不需要特殊的接口,绝大多数对象可以做到完全不必依赖容器。

依赖查找

依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。

依赖查找也有两种类型:依赖拖拽(DP)和上下文化依赖查找(CDL)。

上下文依赖查找(Contextualized Dependency Lookup)

在某些方面跟依赖拖拽类似,但是上下文依赖查找中,查找的过程是在容器管理的资源中进行的,而不是从集中注册表中,并且通常是作用在某些设置点上。

依赖拖拽 (Dependency Pull)

依赖拖拽:注入的对象如何与组件发生联系,这个过程就是通过依赖拖拽实现 。(较少有使用)

而通常对注入对象的配置可以通过一个 xml 文件完成。依赖拖拽就是通过这种方式对对象进行集中管理。

2.5 Spring 的 IoC

Spring 的 IoC 设计支持以下功能:

  • 依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 指定初始化方法和销毁方法
  • 支持回调某些方法(但是需要实现 Spring 接口,略有侵入)

其中,最重要的就是依赖注入,从 XML 的配置上说,即 ref 标签。对应 Spring RuntimeBeanReference 对象。

对于 IoC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。

Spring 中的控制反转(IoC)和依赖注入(DI) - spring 中文网 (springdoc.cn)

3.AOP

4.事务管理

什么是事务?
事务是逻辑上的一组操作,要么都执行,要么都不执行。
我们平时所说的事务其实指的是数据库的事务,在spring框架中提供了对数据库事务的管理,spring事务是对数据库事务的封装,最后本质的实现还是在数据库,如果数据库不支持事务,spring事务是不起作用的。
事务的特性(ACID)
● 原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么全部不完成,不会结束在中间的某个环节;
● 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
● 事务隔离(Isolation):多个事务之间是独立的,不相互影响的。
● 持久性(Durability):事务处理结束后,对数据的修改就是持久的,即便系统故障也不会丢失。
只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!

5.常见面试题