Spring 框架基础知识

Spring 中的单例 bean 是否是线程安全的:

         spring 框架中的 bean 默认是单例,如果当前 bean 是一个无状态对象是线程安全,如果当前 bean 不是无状态对象不是线程安全的,可以根据当前对象中是否有共享属性,判断当前对象是否为无状态对象,无共享属性为无状态对象,如果不是无状态对象可以使用 Scope 注解,设置为 多例 或者 使用锁 解决线程安全问题

Spring AOP :

         AOP 面向切面编程,用于处理与当前业务无关,但是又对多个模块产生影响的逻辑,通常将其抽取为可复用一个公共方法,这个公共方法叫做切面, 减少系统中重复代码 , 提高系统可维护性.

        在项目中经常使用注解加AOP 实现数据缓存、重复提交、事务处理等功能 

Spring 事务是如何完成的:

        Spring 提供两种事务实现方式:

                1. 编程式事务,需要手动编写代码开启事务、提交数据或回滚数据

                2. 声明式事务,使用事务注解,由 spring 框架使用动态代理完成事务开启、数据提交或数据回滚 

        Spring 事务注解失效:

                 1. 使用事务注解,在处理业务逻辑时手动捕捉异常信息,导致事务无法捕捉异常失效

                 2. 同一个类中,一个为加事务注解的方法中调用添加事务注解的方法,导致事务注解失效,因为同一个类两个方法互相调用不走代理类,无法开启事务

 Spring bean 生命周期:

          在 Spring 容器创建时会根据 bean xml 信息或者 bean 使用的注解信息,创建一个 bean definition 对象,bean definition 对象中包含了 bean 基础信息如 bean 名称、类全限定名等信息,后续 Spring 容器根据 bean definition 初始化 bean 对象

          1. 使用反射做构造方法构造一个普通对象,此时对象中的属性没有填充,

          2. 注入依赖信息

          3. 如果 bean 实现了Spring 提供 Aware 结尾的接口方法,会回调这些方法

          4. 调用 PostProcessorBeforeInitialization 前置处理方法

          5. 调用 bean 指定的初始化方法

          6. 调用 PostProcessorAfterInitialization  后置处理方法

          7. 随着Spring 容器销毁 ,bean 对象销毁并回调指定的销毁方法

Spring 循环依赖:

      bean 对象注入依赖信息时可能出现两个 bean 对象循环依赖问题,例如,创建 A 对象,在注入依赖信息时需要 B 对象,可是 B 对象还没有创建,需要先创建 B 对象, 但是在创建 B 进行信息填充时发现需要 A 对象,可是 A 对象还在创建中出现循环依赖问题了 

       Spring 使用三级缓存解决循环依赖问题:

      1. SingletonObjects 一级缓存  2. earlySingletonObjects 二级缓存 3. SingletonFactories 三级缓存

           Spring 在创建一个完整A对象前,先使用反射创建一个普通A对象,在根据普通A对象生成一个工厂对象(ObjectFactory),将工厂对象存入三级缓存(SingletonFactories)中,然后进行A对象属性填充,属性填充的过程中需要注入B对象信息,会去缓存中获取B对象,当B对象不存在去创建B对象并填充属性,发现 B 对象需要注入A 对象,去缓存中获取A对象,在三级缓存中获取到A对象的工厂对象,通过A对象的工厂对象生成一个A对象,存入到二级缓存(earlySingletonObject)中并删除三级缓存中的工厂对象,然后注入给B对象中,让B对象创建成功,再将完成的B对象注入给A对象,A对象正常创建成功后删除二级缓存数据,把完成A对象存入一级缓存(SingletonObjects)中

SpringMVC 执行流程:

         Spring MVC 遵循 模型 - 视图 - 控制器 设计的Web轻量级框架,只要围绕 DispatcherServlet 

 前端控制器实现,主要执行流程由一下几步:

        1. DispatcherServlet 组件接受前端请求并将请求信息发给 Handler Mapping 映射处理器

        2. handler Mapping 映射处理器根据请求路径,查找当前请求接口对应的处理器,然后生成处理器对象以及处理器拦截器信息返回给 DispatcherServlet 

        3. DsipatcherServlet 在将信息给处理器适配器( Handler Adapter)

        4. 适配器查找适配找到具体的处理器

        5. 处理器进行参数解析业务逻辑执行以及返回值转换(转换为JSON),然后将数据返回给前端

        注意:现在的项目基本都是前后端分离的,视图解析生成等流程基本不在使用

Spring Boot 自动配置实现流程:

         使用 spring boot 项目在启动类中 添加一个 SpringBootApplication 注解,这个注解由三个注解组成,SpringBootConfiguration 、EnbleAutoConfiguration 、ComponentScan

          1. SpringBootConfiguration 

          2. ComponentScan 扫描启动类文件夹以及文件夹一下的文件

          3. EnableAotuConfiguration 主要功能是实现自动化配置,该注解中有一个Import 注解会导入配置选择器,该类会读取项目引入 jar 包中 classpath 路径下对应的 META-INF/spring.factorise 文件,在spring.factories 文件中存放要配置类的全类名,在自动配置这些类时会先使用Conditional注解判断当前项目中是否由对应的class 文件,没有 class 文件不配置该信息

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值