框架面试题整理

框架篇

Spring

Spring
Bean线程安全问题
Spring框架中的bean是单例的吗

默认是单例的singleton: Bean在每个SpringIOC容器中只有一个实例

prototype:一个Bean的定义可以有多个实例

Spring框架中的单例Bean是线程安全的吗

不是线程安全的

一般来说,Spring中的Bean都是注入的无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,就要考虑线程安全的问题了,可以使用多例或者加锁来解决

在这里插入图片描述

AOP
什么是AOP

AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

常见AOP使用场景
  • 记录操作日志
    在这里插入图片描述

  • 缓存处理

  • Spring中内置的事务处理

事务原理
Spring支持的事务?
  • 编程式事务控制 :需使用TransactionTemplate来进行实现,对业务代码有侵入性,项目中很少使用
  • 声明式事务管理
    • ​ 声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
    • 在这里插入图片描述
事务失效
  • 捕获异常时失效 : 业务代码捕获异常后,自己处理了,就不会被事务的异常处理机制检测到,可以手动抛出异常
    *在这里插入图片描述

  • 抛出检查异常时失效: Spring默认只会回滚非检查异常

    • 在这里插入图片描述
  • 非public方法

    • 在这里插入图片描述
Bean的生命周期

在这里插入图片描述

BeanDefinition是什么

Spring容器在进行实例化时,会将xml配置的的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean

bean的定义对象

在这里插入图片描述

Spring的Bean的生命周期
  • 通过BeanDefinition获取bean的定义信息
  • 调用构造函数实例化bean
  • bean的依赖注入
  • 处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)
  • Bean的后置处理器BeanPostProcessor-前置
  • 初始化方法(InitializingBean、init-method)
  • Bean的后置处理器BeanPostProcessor-后置
  • 销毁bean

在这里插入图片描述

循序依赖
循环依赖/引用是什么

循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A

循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖

Spring可以解决Bean初始化时候的循环依赖

Spring框架的三级缓存是什么
//单实例对象注册器
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {   	private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;                                               private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256); //一级缓存 
                                                                                                        private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16); //三级缓存
                                                                                                        private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16); //二级缓存
                                                                                                       }

  • 一级缓存 singletonObjects

    • 单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
    • 在这里插入图片描述
  • 二级缓存 earlySingletonObjects

    • 缓存早期的bean对象
    • 在这里插入图片描述
  • 三级缓存 singletonFactories

    • 缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的
    • 在这里插入图片描述
构造方法出现了循环依赖怎么办?

在这里插入图片描述

懒加载: 添加注解 @Lazy

为什么构造方法会出现循环依赖

bean的生命周期的Bean要先经过构造方法才 可以创建成功,所以要延迟加载,用到的时候再加载了。

Spring MVC
执行流程
视图阶段(老旧JSP)

在这里插入图片描述

用户发送请求-> 前端控制器查询handler -> 处理器映射器里面封装了每个处理器的信息 返回处理器执行链给前端控制器(有可能有拦截器)所以直接返回一个执行链-> 前端控制器再发送请求到处理器适配器 -> 处理器适配器帮我们将处理传过来的参数、处理返回值

处理器适配器执行处理器Handler-> 处理器返回数据给处理器适配器->处理器适配器返回ModelAndView给前端控制器->前端控制将数据放到视图解析器进行解析数据->数据解析器将View对象返回给前端控制器->前端控制器渲染视图->前端控制器返回请求到网页客户端

  1. 用户发送出请求到前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
  3. HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
  4. DispatcherServlet调用HandlerAdapter(处理器适配器)
  5. HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
  6. Controller执行完成返回ModelAndView对象
  7. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)
  9. ViewReslover解析后返回具体View(视图)
  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
  11. DispatcherServlet响应用户
前后端分离阶段

在这里插入图片描述

  1. 用户发送出请求到前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
  3. HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
  4. DispatcherServlet调用HandlerAdapter(处理器适配器)
  5. HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
  6. 方法上添加了@ResponseBody
  7. 通过HttpMessageConverter来返回结果转换为JSON并响应
SpringBoot
自动配置原理

@SpringBootConfiguration: 该注解与@Configuration注解作用相同,用来声明当前类是一个配置类

@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包

@EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解

在这里插入图片描述

首先@EnableAutoConfiguration注解里面有 @Import注解->导入了AutoConfigurationImportSelector这个类->AutoConfigurationImportSelector查找META-INF下面的spring.factories文件->spring.factories文件里面包含了100多个bean,不是默认生效的->每一个bean都会判断是否有对应字节码 @ConditionOnClass,如果我们导入这个bean的依赖则有对应字节码->判断环境中有没有对应的Bean ,没有bean就会注册bean到容器

Spring常见注解有哪些

关注 Bean 依赖注入方面

在这里插入图片描述

SpringMvc的常见注解有哪些

关注 请求处理方面

在这里插入图片描述

SpringBoot常见注解有哪些

SpringBootApplication里面的三个核心注解

在这里插入图片描述

MyBatis

执行流程

在这里插入图片描述

在这里插入图片描述

  1. 读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件
  2. 构造会话工厂SqlSessionFactory
  3. 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)
  4. 操作数据库的接口,Executor执行器,同时负责查询缓存的维护
  5. Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
  6. 输入参数映射
  7. 输出结果映射
延迟加载

就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。

Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载

在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false,默认是关闭的

在这里插入图片描述

一二级缓存

在这里插入图片描述

一级缓存

​ 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存

在这里插入图片描述

二级缓存

二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用 PerpetualCache,HashMap 存储

开启二级缓存

  1. 全局配置文件

    1. <settings>
          <setting name="cacheEnabled" value="true
      </settings>
      
      
  2. 映射文件

    1. 使用标签让当前mapper生效二级缓存

在这里插入图片描述

注意事项

  • 对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear
  • 二级缓存需要缓存的数据实现Serializable接口
  • 只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 面试题整理是为了帮助准备面试的候选人更好地了解面试的内容和要求。对于Java2021的面试题整理,可以从各个方面进行组织和分类,以便更好地帮助面试者准备。下面是我对Java2021面试题整理的一些建议。 1.基础知识:面试题可以包括Java语言的基本语法、关键字、数据类型、流程控制语句、异常处理等方面的问题。这些问题可以帮助面试者检验自己对Java语言基础知识的掌握程度。 2.面向对象:面试题可以涉及Java面向对象的概念、封装、继承、多态以及接口、抽象类等方面的问题。这些问题可以帮助面试者了解Java面向对象编程的特点和应用。 3.集合框架面试题可以包括关于Java集合框架的知识,如ArrayList、LinkedList、HashSet、HashMap等的特性、用法和区别。这些问题可以帮助面试者检验自己对Java集合框架的理解和应用能力。 4.多线程:面试题可以涉及Java多线程编程的基本概念、线程的创建与启动、线程同步与互斥、线程池等方面的问题。这些问题可以帮助面试者了解多线程编程的原理和实践。 5.IO流:面试题可以包括关于Java IO流的知识,如输入输出流的分类、字符流和字节流的区别、文件读写操作等方面的问题。这些问题可以帮助面试者检验自己对IO流的理解和应用。 6.异常处理:面试题可以涉及Java异常处理的机制、try-catch语句的使用、自定义异常等方面的问题。这些问题可以帮助面试者了解异常处理的原理和常见应用。 7.Java虚拟机:面试题可以包括Java虚拟机(JVM)的基本概念、内存模型、垃圾回收算法等方面的问题。这些问题可以帮助面试者了解JVM的工作原理和性能优化。 8.框架和工具:面试题可以涉及Java常用的开发框架和工具,如Spring、Hibernate、MyBatis、Maven等方面的问题。这些问题可以帮助面试者了解开发框架的应用和工具的使用。 通过对这些方面的面试题整理,可以帮助面试者全面了解Java2021面试的内容和要求,并有针对性地准备和复习相关知识。面试者应该注重理论的学习,同时结合实践经验进行练习,以便在面试时能够更好地展示自己的能力和潜力。同时,面试者还应注意自己的沟通能力、问题分析能力和解决问题的能力,这些都是面试过程中重要的评估指标。 ### 回答2: Java2021面试题整理主要集中在以下几个方面: 1. 基础知识:Java中的基本数据类型、变量和常量、运算符、控制语句等内容是面试中常见的考点。面试官会通过这些问题判断候选人对Java基础知识的熟悉程度和掌握能力。 2. 面向对象编程:Java是一门面向对象的编程语言,所以面试中对面向对象的理解和应用也是重要的考点。常见的问题包括类和对象、继承和多态、封装和抽象等。 3. 异常处理:Java中的异常处理是编程中的重要内容,面试中会涉及到异常的概念、异常的分类、如何捕获和处理异常、自定义异常等。 4. 集合框架Java集合框架Java开发中常用的工具,常见的面试题会涉及到ArrayList、LinkedList、HashMap等集合的特点和应用场景,以及集合的遍历和使用方法。 5. 多线程:Java是一门支持多线程的语言,所以多线程的知识也是面试中的热点考点。常见的问题包括线程的生命周期、线程同步与互斥、线程间的通信、线程池等。 6. JVM相关知识:Java虚拟机(JVM)是Java运行的基础,所以对JVM的了解也是面试中的重要考点。常见问题包括JVM的结构、内存模型、垃圾回收机制等。 此外,面试中还可能涉及到数据库、网络编程、设计模式等其他相关知识。因此,面试前需要对Java的相关知识有全面的掌握,并且要能够灵活运用这些知识进行问题的解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值