spring专题
2022-03-11 00:32:27 0 举报
AI智能生成
spring知识体系架构
作者其他创作
大纲/内容
什么是spring:是一个轻量级java框架,解决企业级开发的业务层与其他层的耦合问题,根本使命是降低企业级应用开发的复杂性,以IOC容器和AOP模块为核心,实现了对象耦合关系管理,充分支持面向对象开发
分支主题
springCore:核心容器,提供了框架最基础的组成部分,包括IOC和DI
springBeans:提供beanFactory,是工厂模式一个经典的实现,spring将管理的对象称为bean
springContext:构建于core基础包之上的context封装包,提供了一种框架式的对象访问方法
springJDBC:提供了一个JDBC抽象层,简化JDBC
springAOP:提供了面向切面的编程实现,你可以自定义拦截器、切点等
springWeb:提供针对web开发的集成特性,如文件上传等,利用servlet-listeners进行IOC容器初始化和针对WEB的AppilcationContext
springTest:为测试提供支持,支持使用Junit或estNG对spring组件进行单元测试和集成测试
组成模块
工厂模式:beanFactory,用来创建对象实例
单例模式:默认bean对象的创建模式
代理模式:aop功能的核心,比如JDK动态代理和CGLIB字节码生成技术
模板方法:解决代码重复性的问题,比如RestTemplate、JmsTemplate
观察者模式:定义对象一对多的关系,状态变化能通知到所有依赖对象,如ApplicationListener
使用到的设计模式
上下文开始事件:调用configurableApplicationContext的start方法触发
上下文更新事件:调用configurableApplicationContext的refresh方法触发
上下文停止事件:调用configurableApplicationContext的stop方法触发
上下文关闭事件:application容器被关闭时触发,容器被关闭时,所有的单例bean都被销毁
请求处理事件:web请求结束触发,若bean实现了applicationListener接口,则当一个applicationEvent被发布时,bean会自动收到通知
事件类型
基础概念
IOC即为控制反转,它把传统意义上由代码直接操作的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。控制反转就是指对对象的控制权的转移,由程序代码转移到了外部容器,通过工厂模式和反射机制实现
springIOC负责创建对象、通过依赖注入(DI)管理对象、装配对象,配置对象,并负责管理这些对象整个生命周期
通过IOC,方便了对象的管理和维护,解耦了对象的创建和使用,托管了类的生产过程,使得应用容易被测试,保证了低侵入性
基本原则:应用代码不应该负责创建和管理对象,应交给IOC容器负责,对象查找的工作也要从应用代码抽离,均交给IOC容器负责。容器全权处理对象整个生命周期。容器把符合依赖关系的对象通过属性或构造器传递给需要的对象
IOC
通过给spring容器提供配置元数据的方式,被IOC容器初始化、装配、管理的对象,可基于java配置、注解配置、xml文件配置的方式提供元数据,注入方式有set方法注入、构造器注入、静态工厂注入、实例工厂注入等四种注入bean的方式
通过bean定义中的scope属性定义
singleton:整个IOC容器中只有一个实例
prototype:一个bean允许有多个实例
request:每次http请求都会创建一个bean,仅基于WEB的applicationContext有效
session:在一个http session中,一个bean对应一个实例。仅基于WEB的applicationContext有效
global-session:在一个全局的http session中,一个bean对应一个实例。仅基于WEB的applicationContext有效
类型
注意:默认的作用域是singleton。使用prototype需要慎重考虑,因为频繁的创建和销毁bean会带来很大的性能开销
作用域
单例bean都是非线程安全的,实际上spring bean的大部分都是无状态的,某种程度也是线程安全的。如果bean有状态的话,需要额外保证。最简单的方式是将bean的作用域变成prototype
spring对bean中非线程安全状态采用threadLocal进行处理
线程安全问题
传统java应用中,我们使用java关键字new进行实例化后,bean即可使用;一旦不再使用,则由java自动回收器进行垃圾回收。相比之下,spring中的bean的生命周期较为复杂,了解清楚其创建流程,可以利用扩展点来自定义bean的创建过程。bean在容器中从创建到销毁都经历了若干阶段,每一个阶段都可以针对spring管理bean进行自定义定制
生命周期
在spring中,对象无需自己查找或创建与其关联度的其它对象,由容器复制吧需要协作的对象引用赋给各个对象,使用autowrite来配置自动装载模式
装配过程:autowrite装配过程:启动IOC容器时,自动加载了AutowritedAnnotationBeanPostProcessor处理器,当容器扫描到相关注解时,就会在IOC容器中自动查找需要的bean并装配给该对象的属性
查询结果只有一个,就将该bean装配给加了主键的指定属性
查找有多个,根据名称来查找
查找结果为空,抛出异常。解决方法:使用require = false
bean查找过程
自动装配
beans
编程式事务管理:内部代码编程实现,比较灵活但难以维护
声明式事务管理:可将业务代码和事务管理分离,一般是使用注解或XML配置来管理事务
事务类型
本质:依靠数据库提供的事务管理支持,真正的是通过数据库底层的提交和回滚实现的
指spring中多个方法调用中,事务同时存在的时候,spring如何处理这些事务的行为
propagation-required:默认设置,如果没有事务,就新建一个事务,否则加入已有事务
propagation-supports:支持当前事务,已有事务就加入,否则以非事务执行
propagation-mandatory:支持当前事务,已有事务就加入,否则抛出异常
propagation-requires-new:无论当前是否存在事务,都新建一个事务
propagation-not-support:以非事务的形式执行,已有事务执行挂起
propagation-never:以非事务的形式执行,如果存在当前事务,抛出异常
propagation-nested:存在当前事务,就嵌套执行;否则以required方式执行
事务传播行为
isolation-default:使用数据库设置
isolation-read-uncommit:未提交读,事务未提交就可被其它事务读取,可能会出现幻读、脏读、不可重复读
isolation-read-commit:提交读,会造成幻读、不可重复读
isolation-repeatable-read:可重复读,mysql的默认级别,保证多次读取同一个数据时,禁止读取到未提交数据
isolation-serializable:序列化,代价最高的隔离级别
事务隔离级别
事务
数据访问
AOP称为面向切面编程,是作为OOP面向对象只基于纵向关系的补充,作为定义横向关系出现,将与业务无关、却对多个对象产生影响的公共行为和逻辑抽取封装成可重用模块,并称为切面。一般用于权限认证、日志处理、事务处理等,具有减少重复代码、降低模块耦合度的作用
概念
代理:通过一定的方式,提供目标对象的另外的访问方式,即通过代理类来访问对象。主要分为静态代理和动态代理
springAOP:动态代理,不修改字节码,而是运行时生成AOP对象,包含了目标对象的全部方法,并在特定的切点作了逻辑增强,并回调原对象方法
AspectJAOP:静态代理,编译期就会生成代理类,也称编译时增强,将切面织入字节码中,运行的时候就是增强的AOP对象,需要特定的编译器进行处理
SpringAOP与AspectjAOP
JDK动态代理:只提供接口的代理,不支持类。核心是InvocationHandler和Proxy类,InvovationHandler通过invoke方法反射调用目标类的代码,动态的将横切逻辑和业务编织在一起;然后通过Proxy类动态创建符合接口的实例,生成目标类的代理对象
CGLIB动态代理:如果目标类没有实现InvocationHandler接口,需要采用这种方式动态代理目标类。它是一个代码生成库,可在运行时动态生成代理子类对象,覆盖其中特定的方法并添加增强代码。CGLIB是通过继承的方式实现的,不能代理被标记成final的类。底层基于ASM实现
JDK动态代理和CGLIB动态代理
代理模式
AOP
@requestMapping:将特定的HTTP请求映射到处理相应请求的控制器的类或方法。映射到类级别:映射请求的URL;方法级别:URL和请求方式
@qualifier:当有多个相同类型的bean并希望使用属性装配其中一个bean时,指定应装配哪个bean来消除歧义
@Repository:具有组件的特化,为DAO提供了额外的支持,将DAO导入容器,并使未经检查的异常转为spring dataAccessxception
spring体系注解
相比于spring,容易上手,配置简单,开箱即用,不需XML配置、避免了大量的maven导入冲突,内置了tomcat等容器直接运行
componentScan
springbootconfiguration
enableautoconfiguration
@springbootapplication
核心注解
提供了配置springIOC容器纯java方法。优点有:面向对象的配置、减少或消除XML配置、类型安全和重构友好
springBoot
随着业务量的不断发展,单体应用固有的缺陷无法满足需求,造成代码结构混乱、开发效率低、排查问题成本高等问题,需要一套微服务架构取代。springCloud就是这样的微服务框架,是一系列框架的有序结合,利用了springBoot开发的便利性巧妙的封装屏蔽复杂的配置和实现原理,给开发者提供了一套简单易用、易于部署、易于维护的分布式系统开发工具包
优点:应用广泛,基于spring基础,功能齐全、组件完善、减轻开发成本、跨平台
缺点:微服务过大,治理困难;分布式开发成本较高,对团队的挑战大
优缺点
springConfig:集中化配置管理工具
Eureka:服务治理,服务注册和发现
Ribbon:复制均衡的服务调用组件,提供多种负载均衡策略
Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供容错能力
Feign:基于Hytrix和Ribbon的声明式服务调用组件
Zuul:网关组件,提供路由和过滤功能
springNetflix
springBus
springconsul
springsleuth
springStream
springTask
springZookeeper
springGateway
springOpenFeign
主要项目
springCloud
spring专题
0 条评论
回复 删除
下一页