天天看点

Spring的体系结构、核心特性

spring的优点

spring的体系结构

spring webflux

spring的2大特性 | 核心

IoC 控制反转

Spring容器的核心接口

AOP 面向切面编程

aop中的主要名词

aop的织入时机 | 方式

spring提供的2种aop实现

spring容器的启动 | 初始化过程

非侵入式设计,降低代码耦合程度

支持AOP

强大的整合能力,可以和很多优秀框架无缝整合

Spring的体系结构、核心特性

Spring是Java应用 full-stack 式的轻量级开源框架,以 IoC(Inverse Of Control,控制反转)和 AOP(Aspect Oriented Programming,面向切面编程)为核心,并提供了Data Access数据访问模块来操作数据源,提供了Web模块来支持web开发。

spring的5大版块|功能

Test 测试模块:提供对测试的支持

Core Container 核心容器模块:实现spring容器,主要提供IoC/DI功能

AOP模块:提供对面向切面编程(AOP)的支持

Data Access/Integration 数据访问/集成模块:提供对数据源操作的支持,包括对jdbc、orm映射框架、xml解析、消息队列、事务管理的支持。

Web模块:提供对web应用的支持

Core Container模块分为4个小模块

Beans:提供BeanFactory,用于创建bean

Core:提供IoC/DI功能

Context:此模块建立在Beans、Core模块的基础上,用来访问对象的定义、配置(上下文),以及整合其它框架时提供对第三方库的支持

SpEL:提供对Spring EL(表达式语言)的支持

AOP模块提供了2种实现AOP的方式

spring aop:早期版本中提供的

aspectj:在后续版本中集成的

在目前最新的5.x版本中,Web模块已经废弃了 Portlet 组件,同时增加了用于异步响应式处理的 WebFlux 组件。

spring web应用可以基于spring mvc,也可以基于spring webflux,对应的技术栈如下

Spring的体系结构、核心特性

spring mvc:基于serlvet,servlet从3.1开始也提供了非阻塞的api,但牺牲了其它特点,使用servlet时一般都是使用阻塞的api,一个线程处理一个请求

spring webflux:spring5.x版本推出的,基于reactive,非阻塞、支持异步,一个线程可以同时处理多个请求,用少量的线程就可以处理大量的请求。spring webflux处理请求的速度不一定比spring webmvc快,但极大地提高了系统的吞吐量,适合在机器性能不足的情况下用来提高吞吐量。缺点是使用函数式编程,调试难度比spring webmvc大。

以springboot应用为例

IoC(控制反转)是一种编程思想,将原本在程序中手动创建对象的控制权,交给IoC容器,由容器统一管理对象间的依赖关系,负责创建对象、完成依赖的注入。

IoC把开发者从复杂的依赖关系中解放出来,无需关心对象的创建过程,大大简化了应用的开发、降低了开发难度,增加了项目的可维护性。

IoC只是一种编程思想,所有实现了IoC的容器都叫做IoC容器,Spring容器只是IoC的其中一种实现,Spring容器 ≠ IoC容器,只是IoC容器中的一种。

IoC容器的优点

避免在各处使用new来创建实例,降低类之间的耦合度,易于维护

由容器自动创建类的实例、注入所需依赖,开发者无需关心对象创建的细节、对象间复杂的依赖关系

IoC常见的实现方式

DI:依赖注入,IoC容器主动给bean注入所需的依赖

DL:依赖查找,bean主动到IoC容器中寻找所需的依赖

DL是EJB时代的方式,现在的主流方式是DI

Spring容器提供的功能

依赖检查、依赖注入

自动装配

可以设置bean的初始化方法、销毁方法、回调方法

1、BeanFactory

BeanFactory是spring最核心的接口,顾名思义是生产 bean 的工厂,负责生产和管理各个 bean 实例,用于建立bean之间的依赖关系、提供IoC的配置机制、管理bean的生命周期。

2、ApplicationContext 应用上下文

ApplicationContext继承了多个接口,提供了处理bean的能力,比如继承了ResourcePatternResolver接口,可以加载解析资源文件;继承了ApplicationEventPublisher接口,可以监听、发布事件;继承了多种类型的BeanFactory,可以管理、装配bean。间接继承了 BeanFactory 接口。

Spring的体系结构、核心特性

这2个接口都有众多的子接口、实现类。

二者的区别:BeanFactory提供spring框架的基础功能,主要在spring框架内部使用,面向spring框架本身;ApplicationContext在BeanFactory的基础上封装了更多的基础功能,主要提供给spring的使用者调用,面向spring的使用者。

aop: Aspect-Oriented Programming 面向切面编程,是面向对象编程的一种补充,把和业务逻辑无关的系统服务级的横切逻辑剥离出来,不与业务代码耦合在一起,减少系统中的重复代码,使系统变得高内聚、低耦合,更易维护,常见的应用比如日志记录、事务管理、安全检查、缓存更新等。

aspect 切面:横切逻辑的代码实现

target 目标:应用切面的业务对象

join point 连接点:目标类|对象中的所有方法都可以作为连接点

point cut 切入点:目标类|对象中实际应用切面 | 切面的方法

weaving 织入:把切面应用到目标对象的连接点以实现增强的过程

编译时织入:通过修改编译生成的字节码实现,需要借助专门的编译器,缺点是编译就已确定要增强的对象、要应用的增强,不够灵活

编译后织入:生成字节码之后、类加载之前,使用工具对字节码进行处理以应用增强

类加载时织入:使用自定义的类加载器,在类加载时应用增强

运行时织入:在运行时通过动态代理生成代理,使用代理代替目标对象进行操作

1、spring aop

spring早期提供的aop实现方式,只提供简单的aop实现,只能对spring容器中的bean应用增强,只能对方法进行增强。

基于动态代理实现,在运行时进行织入,可以指定要使用的动态代理类型,未指定时默认使用jdk动态代理,如果不能使用jdk动态代理生成代理对象(不满足jdk动态代理的使用要求),则使用cglib代理。

2、aspectj

aspectj是一个专业的aop框架,提供完整的aop解决方案,在spring后续版本中进行了集成。aspectj比spring aop更加强大,可对所有域对象上实现增强(可以对spring容器之内、之外的对象进行增强),可对字段、方法、构造方法等内容进行增强,

aspectj支持在编译时、编译后、类加载时进行织入,通常是在编译时进行织入,基于字节码操作,使用的是静态代理,需要借助AspectJ 编译器 (ajc) 。

性能方面:aspectj在编译时就以确定增强,使用时直接生成代理;spring aop是在运行时动态生成代理,性能比aspectj差,在大量使用aop的项目中性能差距比较明显,更推荐使用aspectj。

Spring的体系结构、核心特性
Spring的体系结构、核心特性

Spring容器实际是一个Map,Map中存放各种对象。

读取配置文件生成对应的Resource对象

将Resource对象解析为BeanDefinition对象

根据BeanDefinition对象生成对应的Bean,注册到IoC容器中