什么是Spring Framework

Spring 是一个开源的应用框架,目的是降低程序开发的复杂度。

具有的特点有:轻量级与低耦合,支持AOP与IOC

它是分层的体系结构,能够运行用户选择组件,同时能够整合其他框架,如mybatis等

SpringFramework特点

  1. 轻量级:spring在代码量和透明度方面都很轻便
  2. 非入侵式 : 基于Spring开发的应用程序可以不用依赖spring的API
  3. IOC:控制反转,降低系统间耦合
  4. AOP:面向切面,能够将业务逻辑与系统服务分离,实现高内聚
  5. 容器 :对象的生命周期和配置都交由容器负责
  6. MVC:对 web 应用提供了高度可配置性,其他框架的集成也十分方便。
  7. 容器化:Spring 是一个容器,因为它包含并且管理应用对象的生命周期
  8. 组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象

列举一些spring重要的模块spring-framework-introduce-8.png

上图中包含了 Spring 框架的所有模块,这些模块可以满足一切企业级应用开发的需求,在开发过程中可以根据需求有选择性地使用所需要的模块。

Core Container(Spring的核心容器)

image.png
核心容器是建立其他模块的基础,没有这些模块,就不会有AOP,Web等的上层模块的功能

Beans模块:
提供了框架的基础部分,包括控制反转和依赖注入

Core模块:
封装了Spring的底层部分,包括资源访问,类型转化和一些工具类

Context模块:
此模块是建立在Beans模块和Core模块基础之上的,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。

SpEL 模块:
提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。spring-framework-introduce-9.png

Data Access/Integration(数据访问/集成)

image.png
JDBC 模块
提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。

ORM 模块
提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。

OXM 模块
提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。

JMS 模块
指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Transactions 事务模块
支持编程和声明式事务管理。

spring-framework-introduce-10.png

Web模块

image.png

Web 模块
提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。

Servlet 模块
提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。

WebSocket 模块
提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。

Webflux 模块
Spring WebFlux 是 Spring Framework 5.x中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。Spring WebFlux 用于创建基于事件循环执行模型的完全异步且非阻塞的应用程序。

spring-framework-introduce-11.png

AOP、Aspects、Instrumentation和Messaging
image.png

AOP 模块
提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。

Aspects 模块
提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。

Instrumentation 模块
提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。

messaging 模块
Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。

jcl 模块
Spring 5.x中新增了日志框架集成的模块。

spring-framework-introduce-12.png

Test模块

image.png

Test 模块:

Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。
包含Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient。

spring-framework-introduce-13.png

什么是spring配置文件

spring配置文件是XML文件,作用是描述类的配置以及互相引入关系。由于XML配置较为冗余,所以大型项目使用XML配置文件很难管理

IOC

什么是Spring IOC 容器

Spring框架的核心就是 IOC容器。容器的作用是创建对象并把它们通过依赖关系装配在一起,通过配置管理Bean的生命周期。 Spring容器通过 DI 依赖注入来管理组件

image.png

容器通过读取配置数据和类数据进行对象的实例化,配置数据可以由XML文件,注解或Java代码提供

什么是依赖注入 DI

在依赖注入中,不必由用户手动创建对象,但是必须描述他们。不是在代码中将组件和服务联系在一起,而是通过描述配置服务需要用到的组件,有IOC容器将他们装配在一起

DI与IOC的关系

控制反转IOC是通过依赖注入DI实现的,换言之,IOC是设计思想,DI是实现方式

依赖注入的方式

  • 构造函数注入
  • setter 注入
  • 接口注入

在Spring 中,仅提供构造器和setter注入

构造器和setter注入的区别

image.png

Spring 中有多少中IOC容器

两种:

  1. BeanFactory :一个包含的bean集合的工厂类,会在客户端要求的时候去实例化Bean,一般由系统调用
  2. ApplicationContext :在BeanFactory的基础上做了扩展,提供了额外功能,一般由用户调用

image.png

AOP

什么是AOP

AOP是一套程序设计的规范,指的是面向切面编程,而OOP(面向对象编程)同样是一套程序设计规范。

在AOP的编程思想中,通过对程序处理的流程进行抽取,面向的是业务流程中的某个步骤,以获取逻辑步骤之间的隔离,封装的结果是一个切面。

对应的OOM编程思想,是针对业务处理过程中的属性(字段),行为(方法)进行抽取封装,封装的结果是一个类。

AOP中的术语

  • 连接点:表示在业务流程中能够插入功能的扩展点,类似于插槽,连接点可能是类初始化。方法调用,字段调用,异常处理等等时间节点,Spring只支持方法执行连接点。 ** 表示在具体的哪里操作**

  • 切入点: 一组连接点的集合,上面的连接点表示的是具体的某一个类上的某一个方法,而切入点指的是一组有着相同需求的连接点的合集 表示在那些地方操作

  • 通知: 表示的是在连接点上执行的行为 ,通知提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置通知(before advice)、后置通知(after advice)、环绕通知(around advice),在Spring中通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入通知; 表示干什么

  • **切面: 横切关注点的集合模块,比如上边提到的日志组件,就是一个切面。可以认为是通知、引入和切入点的组合; ** AOP中的切面就类似于OOP中的类,是一个具体的模块

  • **引入:**引入就是在一个接口的基础上引入新的接口增强功能。

  • 目标对象: 需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被通知的对象,从而也可称为被通知对象;由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象,在AOP中表示为对谁干

  • 织入: 把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。在AOP中表示为怎么实现的

  • **AOP代理:**织入的一种具体实现方式spring-framework-aop-3.png

AOP是实现方式

AOP的实现方式在于代理模式,分为动态代理实现与静态代理实现

  • 动态代理(Spring AOP):所谓的动态代理就是AOP框架不会去修改字节码,而是在每次运行时生成临时的AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特点的切入点做了增强处理,
  • 静态代理(AspectJ):所谓静态代理,就是AOP框架会在编译阶段就生成AOP代理类,他会在编译阶段将切面直接织入到字节码中,这样程序在运行时就是运行的增强的AOP对象了

Spring中两种代理方式

Spring提供了JDK动态代理和Cglib动态代理,具体使用那种方式有AopProxyFactory根据配置来决定。
默认情况下,如果目标是接口,就使用JDK动态代理,否则使用Cglib动态代理。

  • JDK动态代理:主要涉及Proxy与InvocationHandler。

InvocationHandler是一个接口:通过实现该接口定义横切逻辑,并通过反射调用目标代码,进 而将切面织入切点
Proxy 类:利用 InvocationHandler 动态创建一个符合某一接口的实例,生成目标类的代 理对象。

  • CGLib动态代理:CGLib是一个高性能的代码生成类库,**可以在运行期间扩展Java类与实现Java接口,**由于JDK动态代理只能为实现接口的类做增强,没有办法对无接口的类做增强,这时候就需要用到CGLib创建动态代理对象。

Spring通知类型

在AOP术语中,切面的工作被称之为通知。

  • 前置通知:分法执行之前进行增强
  • 后置通知:方法执行之后进行增强,此时不会关系被增强方法输出值
  • 返回通知:方法执行后增强,可获取到方法输出值
  • 异常通知:方法抛出异常后进行增强
  • 环绕通知:增强包裹了被通知方法,方法调用之前和之后都会执行自定义行为

AspectJ与Spring AOP区别

AspectJ是更强的AOP框架,是实际意义的AOP标准(因为AspcetJ能够支持所有的AOP场景[ 字段连接点,构造器连接点等 ],而SpringAOP只支持方法层面的增强) Spring相当于轻量级别的AOP框架
image.png

Bean

什么是SpringBean?

Spring里面的bean就类似是定义的一个组件,而这个组件的作用就是实现某个功能的

  • bean是构成用户应用程序的主干对象
  • Bean由IOC容器管理(实例化,配置,装配)
  • Bean是基于用户提供的元数据配置创建的

Spring 提供了哪些配置方式

XML配置

顾名思义,就是将bean的信息配置.xml文件里,通过Spring加载文件为我们创建bean。这种方式出现很多早前的SSM项目中,将第三方类库或者一些配置工具类都以这种方式进行配置,主要原因是由于第三方类不支持Spring注解。

  • 优点: 可以使用于任何场景,结构清晰,通俗易懂
  • 缺点: 配置繁琐,不易维护,枯燥无味,扩展性差

Java配置

将类的创建交给我们配置的JavcConfig类来完成,Spring只负责维护和管理,采用纯Java创建方式。其本质上就是把在XML上的配置声明转移到Java配置类中

  • 优点:适用于任何场景,配置方便,因为是纯Java代码,扩展性高,十分灵活
  • 缺点:由于是采用Java类的方式,声明不明显,如果大量配置,可读性比较差

注解配置

通过在类上加注解的方式,来声明一个类交给Spring管理,Spring会自动扫描带有@Component,@Controller,@Service,@Repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。

  • 优点:开发便捷,通俗易懂,方便维护。
  • 缺点:具有局限性,对于一些第三方资源,无法添加注解。只能采用XML或JavaConfig的方式配置

bean的scope?

Spring bean 支持 5 种scope

  • Singleton(单例):单实例
  • Prototype(原型):每次调用都会创建新的实例
  • Request:每次HTTP请求都会创建一个新实例,切仅在当前HTTP请求内有效
  • Session :每次HTTP请求都会创建一个实例,切仅在当前session中有效
  • Global-session:基于spring自己的Session管理体系下的作用域

后三种仅在用户支持Web的ApplicationContext时才可用

bean容器内的生命周期

  1. 根据配置和类信息实例化bean
  2. 使用DI依赖注入填充属性
  3. 配置bean的BeanName,BeanFactory等属性
  4. 如果bean指定了init方法,执行init方法
  5. 初始化完成,
  6. 当容器关闭时,若bean指定了destroy,执行destroy方法

什么是Spring装配

bean在IOC容器中组合在一起,这种行为称为bean装配,容器需要知道需要什么bean已经使用何种方式注入来实现装配

自动装配的方式

Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协作者。

  • no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。
  • byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。
  • byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。
  • 构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。
  • autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。

在程序中使用@autowired等注解显示声明此字段需要被自动装配

自动装配的局限

  • 被覆盖的可能性,使用显示指定依赖项的话会覆盖掉自动装配
  • 基本属性无法装配
  • 同类型同名的类会引发冲突导致无法装配

注解

Spring常用注解

  • @Controller - 用于 Spring MVC 项目中的控制器类。 标志他为一个组件
  • @Service - 用于服务类。标志他为一个组件
  • @RequestMapping - 用于在控制器处理程序方法中配置 URI 映射。
  • @ResponseBody - 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。
  • @PathVariable - 用于将动态值从 URI 映射到处理程序方法参数。
  • @Autowired - 用于在 spring bean 中自动装配依赖项。
  • @Qualifier - 使用 @Autowired 注解,以避免在存在多个 bean 类型实例时出现混淆。
  • @Scope - 用于配置 spring bean 的范围。
  • @Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。
  • @Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP)。

@Component, @Controller, @Repository, @Service 有何区别?

  • @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
  • @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。
  • @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。
  • @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

Autowired注解的作用

@Autowired的作用是精确的控制在何处以及如何进行自动装配,默认使用byType注入,可用在setter方法,构造函数,字段或具有参数的方法上。

Qualifier注解的作用

此组件通常和Autowired注解连用,作用是当自动装配出现歧义时(类名类型都相同),使用此注解具体指定注入哪个类

@RequestMapping 注解有什么用?

@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注解可应用于两个级别:

  • 类级别:映射请求的 URL
  • 方法级别:映射 URL 以及 HTTP 请求方法

MVC

MVC是什么

Spring的模型视图控制器(MVC)是围绕着DispatcherServlet来设计的,这个中心Servlet会吧请求通过映射分法给各个处理器(controller),并且能够支持可配置的处理器映射、本地视图渲染、时区、主题渲染、文件上传等增强功能

MVC执行流程

640.png

  1. HTTP请求到DispatcherServlet
  2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到能够处理请求的Controller
  3. DispatcherServlet将请求提交到Controller
  4. Controller执行业务调用得到ModelAndView,
  5. 将ModelAndView返回中央控制器
  6. DispatcherServlet请求视图处理器处理视图映射,返回视图对象
  7. 进行视图渲染
  8. 将结果进行响应
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐