【spring】spring,springmvc,springboot
admin
2024-05-01 11:27:39
0

spring 底层支撑

spring是一个框架、也是一个容器、也是一个生态。

Spring是一个开源框架是一个全家桶(基石),是为了简化企业开发而生的,是的开发变得更加优雅和简洁。有衍生出产品:springBoot、springSecurity、jpb等。他们的基础都是spring的ioc、aop等。IOC提供了依赖注入的容器,AOP解决了面向切面编程,然后再此两者的基础上实现了其他延伸产品的高阶功能。

  • AOP理解
    任何一个系统都是由不同的组件组成的,每个组件负责一块特定的功能,当然会存在很多组件是跟业务无关的,例如日志、事务、权限等核心服务组件,这些核心服务组件经常融入到具体的业务逻辑中,如果我们为每一个具体业务逻辑操作都添加这样的代码,很明显代码几余太多,因此我们需要将这些公共的代码逻辑抽象出来变成一个切面,然后注入到目标对象(具体业务)中去,AOP正是基于这样的一个思路实现的,通过动态代理的方式,将需要注入切面的对象进行代理,在进行调用的时候,将公共的逻辑直接添加进去,而不需要修改原有业务的逻辑代码,只需要在原来的业务逻辑基础之上做一些增强功能即可。

spring 核心

Spring是一个IOC和AOP的容器框架。IOC控制反转,AOP面向切面编程。容器包含并管理应用对象的生命周期。简单说:spring就是全家桶,而对象就是鸡腿

spring 事务传播机制

多个事务方法相互调用时,事务如何在这些方法之间进行传播,spring中提供了7中不同的传播特性,来保证事务的正常执行:

  • REQUIRED
    默认的传播特性,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务
  • SUPPORTS
    当前存在事务,则加入当前事务,如果当前没有事务,则以非事务的方式执行
  • MANDATORY
  • REQUIRED_NEW
  • NOT_SUPPORTED
  • NEVER
  • NESTED

事务实现方式原理

在使用Spring框架的时候,可以有两种事务的实现方式,一种是编程式事务,有用户自己通过代码来控制事务的处理逻辑,还存一种是声明式事务,通过@Transactional注解来实现。

其实事务的操作本来应该是由数据库来进行控制,但是为了方便用户进行业务逻辑的操作,spring对事务功能进行了扩展实现,一般我们很少会用编程式事务,更多的是通过添加@Transactional注解来进行实现,当添加此注解之后事务的自动功能就会关闭,有spring框架来帮助进行控制。

其实事务操作是AOP的一个核心体现,当一个方法添加@Transactional注解之后,spring会基于这个类生成个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关系,然后去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会直接提交如果出现任何异常情况,那么直接进行回滚操作,当然用户可以控制对哪些异常进行回滚操作。

spring事务出现失效(生产坑)

  1. bean对象没有被spring容器管理
  2. 方法的访问修饰符不是public
  3. 自身调用问题
  4. 数据源没有配置事务管理器
  5. 数据库不支持事务
  6. 异常被捕获
  7. 异常类型错误或者配置错误

spring如何简化开发

  • 基于POJO的轻量级和最小侵入性编程
  • 通过依赖注入和面向接口实现松耦合
  • 基于切面和惯例进行声明式编程
  • 通过切面和模板减少样板式代码

实现一个IOC容器

IOC(Inversion of Control),意思是控制反转,不是什么技术,而是一种设计思想,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。在传统的程序设计中,我们直接在对象内部通过new进行对象创建,是程序主动去创建依赖对象,而IOC是有专门的容器来进行对象的创建,即IOC容器来控制对象的创建。在传统的应用程序中,我们是在对象中主动控制去直接获取依赖对象,这个是正转,反转是由容器来帮忙创建及注入依赖对象,在这个过程中由容器帮我们查找级注入依赖对象,对象只是被动的接受依赖对象
1、先准备一个基本的容器对象,包含一些map结构的集合,用来方便后续过程中存储具体的对象
2、进行配置文件的读取工作或者注解的解析工作,将需要创建的bean对象都封装成BeanDefinition对象存储在容器中
3、容器将封装好的BeanDefinition对象通过反射的方式进行实例化,完成对象的实例化工作
4、进行对象的初始化操作,也就是给类中的对应属性值就行设置,也就是进行依赖注入,完成整个对象的创建,变成一个完整的bean对象,存储在容器的某个map结构中
5、通过容器对象来获取对象,进行对象的获取和逻辑处理工作
6、提供销毁操作,当对象不用或者容器关闭的时候,将无用的对象进行销毁

spring bean生命周期()

  1. 实例化bean对象
    通过反射的方式进行对象的创建,此时的创建只是在堆空间中申请空间,属性都是默认值
  2. 设置对象属性
    给对象中的属性进行值的设置工作
  3. 检查Aware相关接口并设置相关依赖
    如果对象中需要引用容器内部的对象,那么需要调用aware接口的子类方法来进行统一的设置
  4. BeanPostProcessor的前置处理
    对生成的bean对象进行前置的处理工作
  5. 检查是否是InitializingBean的子类来决定是否调用afterPropertiesSet方法
    判断当前bean对象是否设置了InitializingBean接口,然后进行属性的设置等基本工作
  6. 检查是否配置有自定义的init-method方法
    如果当前bean对象定义了初始化方法,那么在此处调用初始化方法
  7. BeanPostProcessor后置处理
    对生成的bean对象进行后置的处理工作
  8. 注册必要的Destruction相关回调接口
    为了方便对象的销毁,在此处调用注销的回调接口,方便对象进行销毁操作

springMvc web框架

主要解决web开发的问题,是基于servlet的一个mvc框架,通过xml配置统一开发前端视图和后端逻辑

工作流程原理

当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
  2. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMappingHandlerMapping根据请求ur查找Handler.
  3. 返回处理器执行链,根据url查找控制器,并且将解析后的信息传递给DispatcherServlet
  4. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  5. 执行handler找到具体的处理器
  6. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  7. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  8. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名9、视图解析器将解析的逻辑视图名传给DispatcherServlet。
  9. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图,进行试图渲染
  10. 将响应数据返回给客户端

SpringBoot 脚手架

spring的配置非常复杂,各种xml、javaConfig、servlet处理起来比较繁琐,为了简化开发者的使用,从而创造性的推出了springBoot框架默认优化配置,简化了springMvc的配置流程;区域与springMvc的是,springBoot专注于单体微服务接口开发和前端解耦。虽然springboot也可以做成spirngmvc前后台一起开发,但是这个不符springboot框架的初衷

自动配置原理

  1. 在springboot启动过程中,显示创建上下文prepareContext(完成自动装配过程)
  2. prepareContext方法中查找load方法,一层层想内点击,最终找到load方法完成该功能,如:获取bean对象定义的加载器
  3. 实现执行load的是BeanDefinitionLoader中的load方法,实际加载bean的方法(有class类型,启动注释类型;resource类型,启动xml解析;如果是package类型,启动扫描包譬如@ComponentScan;如果是字符串类型直接加载)
  4. 从load方法将用来判断是否自愿的类型,是使用groovy加载还是使用注解方式(判断使用groovy脚本、还是判断使用注解加载)
  5. isComponent方法判断启动类中是否包含@Component注解,但是会神奇的发现我们的启动类中并没有该注解,继续更进发现MergedAnnotations类传入了一个参数Searchstrategy.TYPE_HIERARCHY,会查找继承关系中是否包含这注解,@SpringBootApplication–>@SpringBootConfiguration–>@Configuration–>@Component,当找到@Component注解之后,会把该对象注册到AnnotatedBeanDefinitionReader对象中(该步骤中是启动对象注入、自动装配还没开始)
  6. 自动装配入口,从刷新容器开始 refresh()
  7. invokeBeanFactoryPostProcessors方法中完成bean的实例化和执行
  8. 查看invokeBeanFactoryPostProcessors具体执行方法
  9. 开始执行自动配置逻辑(启动类指定的配置,非默认配置),可以通过debug的方式一层层向里进行查找,会发现最终会在ConfigurationqlassParser类中,此类是所有配置类的解析类,所有的解析逻辑在parser.parse(candidates)中
  10. 继续跟进doProcessConfigurationClass方法,此方式是支持注解配置的核心逻辑
  11. processImports 查看获取配置类的逻辑
  12. 继续回到ConfigurationClassParser中的parse方法中的最后一行,继续跟进该方法。

相关内容

热门资讯

请马上停止给娃喝!“网红奶”被... 前段时间,一则热搜在咱们编辑部引起了一阵轰动—— 深圳 4 岁男童喝了“零添加”的生羊奶以后,反复发...
原创 大... 民以食为天,生活无论是忙是闲,都离不开一日三餐。而在每一餐中,都不能少的便是主食,其为我们补充能量,...
原创 家... 小时候放学回家,最幸福的事就是推开家门闻到厨房飘来的香味。妈妈们总能用最普通的食材,变魔术般地端出让...
东北酸菜品牌排行榜:谁是“扛把... 在咱东北,酸菜那可不是一道菜,那是流淌在血液里的乡愁,是冬天饭桌儿的宠儿!杀猪菜、炖粉条、汆白肉、包...
长沙五星级酒店摆摊卖卤味!大厨... 记者 | 陈樱芷 “摆地摊”这一传统赛道,近日迎来了不少“大佬”玩家。 济南一知名酒店董事长上街掌勺...
为什么女生说分手,却总是分不了... 为什么女生说分手,却总是分不了;男的说分手,就真的分了呢?那是因为女生说分手,其实只是赌气而已,而男...
双节棍的武术叫什么名字 双节棍的武术叫什么名字难道就叫双节棍吗双节棍是一种武器,不是一种武术。差不多吧,再说双截棍早被列为一...
我的一天作文 我的一天作文不知道你想表达什么意思,最好是表达清楚一点,这样方便别人回答你的问题
“得我者相惜,失我者永失”这句... “得我者相惜,失我者永失”这句话是什么意思?因为没有找到原文,所以才理解这句话的时候可能就会两个分歧...
《神探狄仁杰3》中的宗主是什么... 《神探狄仁杰3》中的宗主是什么演员啊,演技铁手团宗主颖王元齐的扮演者为钱雁秋,即《神探狄仁杰》的导演...
宋史·赵普传 宋史·赵普传吏 在这里作为动词 是治理;为官 释 是放下的意思如流 是很流畅发箧 就是打开书箱子
宋代的朱熹与陆九渊曾进行多次辩... 宋代的朱熹与陆九渊曾进行多次辩论。朱熹认为,事物不在人...【答案】C【答案解析】试题分析:朱熹的理...
四部和声。 四部和声。乐理怎么学的!!自己去看乐理书!学音乐的这都不会看你以后怎么混!
顾此失彼,是什么意思 顾此失彼,是什么意思顾着这个丢了那个顾此失彼 ( gù cǐ shī bǐ )解 释 顾了这个,丢了...
我见过最不公平的游戏,就是英雄... 我见过最不公平的游戏,就是英雄联盟了,现在退游了你要了冲钱的游戏你就会知道怎么被虐了觉悟就好,我现在...
哪位大神说一下这首歌的歌名。(... 哪位大神说一下这首歌的歌名。(节奏大概的) 等等等等,等等等等,等,等,等等,等等(然后声音拉哪位大...
卡牌大师探戈灵魂的皮肤(红色的... 卡牌大师探戈灵魂的皮肤(红色的那款)有没有特效?还有他的大招用智能施法还是不用的好?(懂的回答)没有...
《我在他乡挺好的》一剧里,简亦... 《我在他乡挺好的》一剧里,简亦繁结局怎么样?《我在他乡挺好的》中简亦繁结局和乔夕辰走到了一起,可以说...
fiction和novel的区... fiction和novel的区别是什么?除了novel指长篇小说,fiction范围更广之外它们还有...