Java面试——框架篇

news2024/9/27 12:16:36

1、Spring框架中的单例bean是线程安全的吗?

    所谓单例就是所有的请求都用一个对象来处理,而多例则指每个请求用一个新的对象来处理。

        结论:线程不安全

        Spring框架中有一个@Scope注解,默认的值就是singleton,单例的。一般在spring的bean都是注入无状态的对象(如service),无状态对象没有线程安全问题;但如果在bean中定义了可修改的成员变量,所有线程都共享一个单例bean,此时需要考虑线程安全问题,可使用多例或者加锁解决。

为什么bean默认是单例的?

         Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。


AOP相关(参考文章 面向切面编程AOP)

2、什么是AOP?

        即面向切面编程将与核心业务无关的代码(即交叉业务)独立的抽取出来,形成一个独立的组件,然后以横向交叉的方式应用到业务流程当中。有利于降低模块之间的耦合。

3、项目中哪里使用了AOP?

  • 记录操作日志。
    • 使用 aop 中的环绕通知 +切点表达式。
    • 切点表达式用来定义通知(Advice)往哪些方法上切入
  • spring实现事务。

4、Spring中的事务是如何实现的?

       使用了@Transactional注解后事务的自动提交功能就会关闭,由spring帮助实现事务的控制。spring实现的事务本质就是由aop完成:对方法前后进行拦截,在执行方法之前 开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。


5、Spring中事务失效的场景有哪些?

  • 异常捕获处理,自己处理了异常,没有抛出,spring不会进行回滚操作。
    • 解决:捕获异常后,手动抛出。
  • spring默认只会滚非检查异常,如抛出检查异常,也会导致事务失效。
    • 解决:@Transactional注解上配置rollbackFor属性为Exception,任意异常都会回滚。
  • 事务方法不是public修饰的,也会导致事务失效。

6、Spring的bean的生命周期

        Spring Bean 的生命周期主要指的是 singleton bean,对于 prototype bean ,Spring 在创建好交给使用者之后则不会再管理后续的生命周期。

        spring在实例化bean之前,会根据BeanDefinition获取bean的定义信息,如:类的全路径、是否单例、是否延迟加载等等...

  • 调用构造函数实例化bean。
  • bean的依赖注入。(如:set注入、autowire注入等)
  • 检查bean是否实现了Aware的相关接口,并设置相关依赖。
  • bean后处理器的before方法。
  • bean的初始化方法。
  • bean后处理器的after方法。
  • 使用bean。
  • 销毁bean。

7、Spring中的循环依赖  

        即一个实例或多个实例存在相互依赖的关系,有点像死锁。

  • singleton下的set注入:
    • spring可以解决此情况的循环依赖问题:在set注入下,“实例化Bean”和“给Bean属性赋值”两个动作可以分开,又因为bean是单例的,所以在实例化完之后可以直接“曝光”。
  • prototype下的set注入:
    • ​​​​​​​spring无法解决,但只要其中一个bean对象改为单例就能解决。
  • singleton下的构造注入:

    • spring无法解决。构造注入会导致“实例化Bean”“给Bean属性赋值”两个动作无法分开,单例bean来不及“曝光”。可以使用注解@Lazy懒加载,什么时候需要对象再进行bean对象的创建。

spring解决循环依赖的三级缓存:

  • 一级缓存:存储的是完整的单例Bean对象,这个Bean对象已经赋值过了。
  • 二级缓存:存储的是早期的单例Bean对象,这个Bean对象属性还没有赋值。
  • 三级缓存:存储的是单例工厂对象,每一个单例Bean对象都会对应一个单例工厂对象。

解决流程:

  • 先实例化A对象,同时创建其工厂对象存入三级缓存。
  • A对象属性赋值需要B对象,实例化B对象,同时创建B的工厂对象,存入三级缓存。
  • B属性赋值需要注入A对象,于是从三级缓存中获取A的工厂对象,生成A对象存入二级缓存。
  • B通过二级缓存里获取A对象,属性赋值成功,于是B对象创建成功,存入一级缓存。
  • 此时A对象从一级缓存中获取B对象,注入成功,并将A对象存入一级缓存。
  • 将二级缓存的临时对象A清除。

8、SpringMVC的执行流程

        基于前后端分离开发的执行流程:

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

9、Springboot自动配置原理

        在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan
        其中 @EnableAutoConfiguration 是实现自动化配置的核心注解。该注解通过 @Import 注解导入对应的配置选择器。 内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。 在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。
        条件判断会有像 @ConditionalOnClass 这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。

10、Spring框架常见注解

Spring:

  • @Component、@Controller、@Service、@Repository将实体类对象实例化到spring中,纳入spring管理。
  • @Autowired:对类成员变量、方法及构造函数进行自动装配,默认根据类型自动装配。
  • @Qualifier:结合@Autowired一起使用用于根据名称进行自动装配。(同一接口有多个实现类,Autowired不知道装配哪个类型)
  • @Scope:标注Bean的作用范围。
  • @Configuration:指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解。
  • @ComponentScan:用于指定 Spring 在初始化容器时要扫描的包。
  • @Bean:使用在方法上,标注将该方法的返回值存储到Spring容器中。
  • @Import:使用@Import导入的类会被Spring加载到IOC容器中。
  • @Aspect、@Before、@After、@Around、@Pointcut:用于切面编程(AOP)

SpringMVC:

  • @RequestMapping:用于将任意HTTP 请求映射到控制器方法上。
    • 各种衍生注解,如:@GetMapping、@PostMapping、@PutMapping等。
  • @RequestBody:将前端传过来的 json数据转化为java对象。
  • @RequestParam:将请求参数绑定到你控制器的方法参数上。
  • @PathViriable:从请求路径下中获取请求参数(/user/{id}),传递给方法的形参。
  • @ResponseBody:将controller方法返回的java对象转化为json对象响应给客户端。
  • @RequestHeader:将请求头中的参数值映射到控制器的参数中。
  • @RestController:@Controller + @ResponseBody

Spring boot:

  • @SpringBootConfiguration:用于定义配置类,可替换xml文件。
  • @EnableAutoConfiguration:打开自动配置功能。
  • @ComponentScan:扫描被@Component (@Service,@Controller)注解的 bean。

11、MyBatis执行流程

  • 读取MyBatis核心配置文件mybatis-config.xml,加载运行环境和映射文件。运行环境包括:事务管理器的配置 + 数据源的配置 ,见MyBatis核心配置文件详解
  • 加载映射文件:映射文件即SQL映射文件(mapper.xml),配置了操作数据库的SQL语句。
  • 构造会话工厂SqlSessionFactory对象:使用SqlSessionFactoryBuilder对象构建。
  • 创建会话对象SqlSession:由会话工厂创建,对象中包含了执行SQL语句的所有方法,每个线程都应该有它自己的 SqlSession 实例。
  • Executor执行器:是MyBatis的核心,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责维护查询缓存
  • MappedStatement对象:MappedStatement是对解析的SQL语句的封装,一个MappedStatement代表了一个sql语句标签。
  • 输入参数映射:输入参数类型可以是基本数据类型,也可以是Map、List、POJO等复杂数据类型。
  • 封装结果集:可以将结果集封装成基本数据类型,也可以是Map、List、POJO等复杂数据类型。

12、Mybatis是否支持延迟加载?底层原理是什么?

Mybatis支持延迟加载:

  • 延迟加载是加载策略的一种,分为延迟加载直接加载两种策略,延迟加载主要体现在关联查询中。即需要用到数据时才加载,不需要用到就不加载,又叫懒加载
  • ⼀对多多对多的情况下通常采⽤延迟加载
  • 在Mybatis配置文件中,可以配置lazyLoadingEnabled决定是否启用延迟加载,默认关闭。

底层原理:

  • 使用CGLIB创建目标对象的代理对象。
  • 当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询。
  • 获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了。

13、Mybatis的一级、二级缓存

       MyBatis的缓存会将 select 语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取。因此,缓存只针对于DQL语句,也就是说缓存机制只对应select语句。

  • 一级缓存:

    • 作用域:SqlSession。
    • 默认开启,只要同一个SqlSession对象执行同一select语句就会走缓存。
    • 缓存失效的情况
      • ①手动情况了一级缓存:sqlSession.clearCache();
      • ②进行了增删改操作。
  • 二级缓存:

    • 作用域:SqlSessionFactory
    • 使用二级缓存需要四个条件
      • ①在配置文件中开启缓存,默认开启。
      • ②在需要使用二级缓存的SqlMapper.xml文件中添加配置:<cache />。
      • ③使用二级缓存的实体类对象必须是可序列化的,即实现Serializable接口。
      • ④SqlSession对象关闭后,一级缓存才会写入二级缓存。
    • 缓存失效的情况
      • 进行了增删改操作。
    • 相关配置:
      • eviction:指定从缓存中移除某个对象的淘汰算法。默认采用LRU策略。
      • flushInterval:二级缓存的刷新时间间隔。

更多缓存相关:mybatis的一二级缓存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1364163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习——设计模式——行为型模式2

文章目录 行为型模式状态模式观察者模式中介者模式迭代器模式访问者模式备忘录模式解释器模式 行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;涉及算法与对象间职责的…

kubernetes(六)

文章目录 1. k8s架构2. k8s安装2.1 颁发证书2.2 部署etcd集群2.3 master节点安装2.3.1 api-server服务安装2.3.2 controller-manager服务安装2.3.3 scheduler服务安装 2.4 node节点安装2.5 配置flannel网络 1. k8s架构 2. k8s安装 # 增加免密操作 [rootk8s-node3 ~]# ssh-keyge…

搭建一个教育小程序的必要步骤

随着科技的飞速发展&#xff0c;小程序已经深入到我们生活的方方面面。对于教育行业来说&#xff0c;小程序的出现不仅为教育机构提供了新的宣传和互动平台&#xff0c;更为学生和家长带来了更为便捷的学习体验。那么&#xff0c;如何开发一款适合教育机构的小程序呢&#xff1…

react+AntDesign 之 pc端项目案例

1.环境搭建以及初始化目录 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start2.安装SCSS SASS 是一种预编译的 CSS&#xff0c;支持一些比较高级的语法&#xff0c;…

鸿蒙OS:不止手机,是物联网应用开发

鸿蒙开发是华为自主研发的面向全场景的分布式操作系统&#xff0c;旨在将生活场景中各类终端进行整合&#xff0c;实现不同终端设备间的快速连接、资源共享、匹配合适设备、提供流畅的全场景体验。 鸿蒙开发具有以下特点&#xff1a; 面向全场景&#xff1a;鸿蒙系统能够覆盖…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-3流体系统建模

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 流量 flow rate q q q m 3 / s m^3/s m3/s 体积 volume V V V m 3 m^3 m3 高度 heigh h h h m m m 压强 pressure p p p …

竞赛练一练 第23期:NOC大赛每日一练,python题目刷题第8天,包含答案解析

题目来自:NOC 大赛创客智慧编程赛项Python 复赛模拟题(二) NOC大赛创客智慧编程赛项Python 复赛模拟题(二) 第一题: 编写一个成绩评价系统,当输入语文、数学和英语三门课程成绩时,输出三门课程总成绩及其等级。 (1)程序提示用户输入三个数字,数字分别表示语文、数学、…

Vue3使用Pinia

1.安装 npm i pinia 2.搭建架子文件 2.1main.js import { createApp } from vue // 引入pinia import { createPinia } from piniaimport App from ./App.vue import router from ./router // 创建pinia const app createApp(App) //安装pinia app.use(createPinia())app.use(…

线程安全、共享变量的可见性

Java中的线程安全问题 谈到线程安全问题&#xff0c;我们先说说什么是共享资源。所谓共享资源&#xff0c;就是说该资源被多个线程所持有或者说多个线程都可以去访问该资源。 线程安全问题是指当多个线程同时读写一个共享资源并且没有任何同步措施时&#xff0c;导致出现脏数…

适合前后端开发的可视化编辑器(拖拽控件)

分享一个面向研发人群使用的前后端分离的低代码软件——JNPF。 JNPF与市面上其他的低代码&#xff08;轻流、宜搭、微搭、简道云、轻流、活字格等等&#xff09;&#xff0c;后者更倾向于非编程人员使用&#xff0c;让业务线人员自行构建应用程序。而 JNPF 这款低代码产品是面向…

【STM32学习】硬件CRC与传统CRC-32计算的不同点

硬件CRC与传统CRC-32计算的不同点 1、stm32的硬件CRC32与传统CRC-32有何不同&#xff1f;2、解决办法 1、stm32的硬件CRC32与传统CRC-32有何不同&#xff1f; ①STM32F103的硬件CRC校验是对整个32位字进行CRC计算&#xff0c;传统的CRC-32是逐字节的计算。 ②STM32的硬件CRC32的…

美食管理与推荐系统Python+Django网站系统+协同过滤推荐算法【计算机课设】

一、介绍 美食管理与推荐系统。本系统使用Python作为主要开发语言开发的一个美食管理推荐网站平台。 网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求&#xff0c;并将用户的相关行为数据保存在数据库中。通过Ajax技术实现前后端的…

【ThreeJS入门——】WEB 3D可视化技术——threejs

简介 网页上已经可以做出很多复杂的动画&#xff0c;精美的效果。下图就是通过WebGL在网页中绘制高性能的3D图形。 threejs是一个让用户通过javascript入手进入搭建webgl项目的类库。 1、搭建第一个场景和物体 三维的物体要渲染在二维的屏幕上。首先要创建一个场景来放置物体…

ASP.NET可视化流程设计器源码

源码介绍: ASP.NET可视化流程设计器源码已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角色的权限管理等系统开发必须功能&#xff0c;大大为您节省开发时间&#xff0c;是您开发OA.CRM、HR等企事业各种应用管理系统和工作流系统的最佳基…

技术旅程分享:收获与成长的探索

2023年对我而言是充满挑战和机遇的一年&#xff0c;我在这段时间里积累了丰富的技术经验和个人成长。通过不懈努力和持续学习&#xff0c;我在技术领域迈出了一系列坚实的步伐。在这篇文章中&#xff0c;我将分享我在这段时间中的收获和技术成长经历&#xff0c;与CSDN的朋友们…

Vue实现加减法验证码

引入Vue.js 在HTML文件的<head>标签中引入Vue.js的CDN链接&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue2.6.11/dist/vue.min.js"></script>创建Vue实例 接下来&#xff0c;我们要创建一个Vue实例&#xff0c;并将其挂载到HTML文…

MIT 6.s081 实验解析——labs2

系列文章目录 MIT 6.s081 实验解析——labs1 MIT 6.s081 实验解析——labs2 文章目录 系列文章目录测试判断流程System call tracingsysinfo![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ab9ca34f1fc64b6aa1df74613dc1a397.png) 测试判断流程 完成代码后将.c文…

领取的试用云服务器在哪

系列文章目录 华为云服务器试用领取 领取的试用云服务器在哪 文章目录 系列文章目录步骤如下 步骤如下 领取完之后在官网下找 在下面找到华为云耀云服务器L实例。 点击进入。 点击HECS。 即可找到自己的云服务器。 需要注意所勾选的地址&#xff0c;选完自己云服务器的地址…

msckf-vio 跑Euroc数据集,并用evo进行评估

所需材料&#xff1a; Euroc数据集主页&#xff1a;https://projects.asl.ethz.ch/datasets/doku.php?idkmavvisualinertialdatasetsevo评估工具代码&#xff1a;https://github.com/MichaelGrupp/evo向msckf-vio中添加保存位姿的代码&#xff0c;可参考https://blog.csdn.ne…

阿里云服务器地域如何选择?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…