当前位置: 首页 > news >正文

Java面试——框架篇

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的一二级缓存

相关文章:

Java面试——框架篇

1、Spring框架中的单例bean是线程安全的吗&#xff1f; 所谓单例就是所有的请求都用一个对象来处理&#xff0c;而多例则指每个请求用一个新的对象来处理。 结论&#xff1a;线程不安全。 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的。一…...

GO语言笔记1-安装与hello world

SDK开发工具包下载 Go语言官网地址&#xff1a;golang.org&#xff0c;无法访问Golang中文社区&#xff1a;首页 - Go语言中文网 - Golang中文社区下载地址&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 尽量去下载稳定版本&#xff0c;根据使用系统下载压缩包格式的安装…...

指针传参误区

C语言中指针作为形参传递时&#xff0c;func&#xff08;*a, *b&#xff09; 这种形式的话&#xff0c;是无法通过简单的 ab来修改的&#xff0c;在函数体内a的地址确实被修改成b的地址了&#xff0c;但是当函数执行结束时&#xff0c;a的地址会重新回到原本的地址里面&#xf…...

力扣-42.接雨水

题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组[0,1,0,2…...

LeetCode-移动零(283)

题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 思路&#xff1a; 这里的思路跟以前做过的去重复数字的思路有点像&…...

文件系统与日志分析

一&#xff0c;文件系统 &#xff08;一&#xff09;inode 和block概述 1&#xff0c;文件数据包括元信息与实际数据 2&#xff0c;文件存储在硬盘上&#xff0c;硬盘最小存储单位是“扇区”&#xff0c;每个扇区存储512字节 3&#xff0c;block (块) 连续的八个扇区组成一…...

labview 与三菱FX 小型PLC通信(OPC)

NI OPC服务器与三菱FX3U PLC通讯方法 一、新建通道名称为&#xff1a;MIT 二、选择三菱FX系列 三、确认端口号相关的参数&#xff08;COM端&#xff1a;7.波特率&#xff1a;9600&#xff0c;数据位&#xff1a;7&#xff0c;校验&#xff1a;奇校验&#xff0c;停止位&#xf…...

掌握Linux网络配置:价格亲民,操作简便!

前言 在Linux系统中&#xff0c;网络配置是实现连接、通信和安全的重要一环。无论你是初学者还是有经验的用户&#xff0c;掌握网络配置命令能帮助你轻松管理网络接口、设置IP地址以及查看连接状态。以下是一些关键命令和示例&#xff0c;让你快速掌握网络操作的精髓&#xff…...

郑州大学算法设计与分析实验2

判断题 1 #include<bits/stdc.h> using namespace std;const int N 50; int f[N], n;int main() { // freopen("1.in", "r", stdin);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;f[1] 1; f[2] 1;for(int i 3; i &l…...

【CMake】1. VSCode 开发环境安装与运行

CMake 示例工程代码 https://github.com/LABELNET/cmake-simple 插件 使用 VSCode 开发C项目&#xff0c;安装 CMake 插件 CMakeCMake ToolsCMake Language Support &#xff08;建议&#xff0c;语法提示) 1. 配置 CMake Language Support , Windows 配置 donet 环境 这…...

使用vue3+<script setup>+element-plus中el-table前端切片完成分页效果

<template><div><el-table :data"visibleData" :row-key"row > row.id"><el-table-column prop"name" label"姓名"></el-table-column><el-table-column prop"age" label"年龄&qu…...

vue 中 computed 和 watch 的区别

在Vue中&#xff0c;computed和watch都是用于监听数据的变化&#xff0c;并且根据变化做出相应的反应。 computed是一个计算属性&#xff0c;它会根据依赖的数据的变化自动计算得出一个新的值&#xff0c;并且具有缓存的特性。当依赖的数据发生变化时&#xff0c;computed属性…...

gephi——graphviz插件设置

gephi_graphviz插件设置 以下是我总结出来的一点经验 1. 安装graphviz软件&#xff0c;请见作者其他博客 2. 安装gephi 插件&#xff0c;并激活 3. 运行graphviz布局&#xff0c;会遇到找不到dot问题 问题描述&#xff1a;Graphviz process error X There was an error launc…...

wireshark抓包分析HTTP协议,HTTP协议执行流程,

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 使用WireShark工具抓取「HTTP协议」的数据包&#…...

Linux第13步_安装“vim编辑器”及应用介绍

学习“磁盘重新分区”后&#xff0c;嵌入式Linux系统环境搭建进入安装“vim编辑器”这个环节。vim编辑器可以用来修改文件&#xff0c;在后期使用中&#xff0c;会经常用到。 1、安装“vim编辑器” 输入“sudo apt-get install vim回车”&#xff0c;就可以执行安装“vim编辑…...

Yapi安装配置(CentOs)

环境要求 nodejs&#xff08;7.6) mongodb&#xff08;2.6&#xff09; git 准备工作 清除yum命令缓存 sudo yum clean all卸载低版本nodejs yum remove nodejs npm -y安装nodejs,获取资源,安装高版本nodejs curl -sL https://rpm.nodesource.com/setup_8.x | bash - #安装 s…...

HCIA-Datacom题库(自己整理分类的)_08_FTP协议【8道题】

一、单选 1.在使用FTP协议升级路由器软件时&#xff0c;传输模式应该选用___ 二进制模式 字节模式 文字模式 流字节模式 解析&#xff1a;二进制模式&#xff1a;在数据连接中传输&#xff0c;不对数据进行任何处理&#xff0c;不需要转换或格式化就可以传输字符。 2.以…...

【开源GPT项目 - 在问】让知识无界,智能触手可及

Chatanywhere: chatAnywhere 在问 | 让知识无界&#xff0c;智能触手可及 项目简介 这是一个免费的在线聊天工具&#xff0c;旨在让用户更方便地享受科技带来的便利。用户可以使用我们的工具来获取答案、寻求建议、进行翻译和计算等等。这是由一位个人开发者创建的&#xff…...

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于Real-ESRGAN的TPU超分模型部署

2023 CCF 大数据与计算智能大赛 《基于TPU平台实现超分辨率重建模型部署》 洋洋很棒 李鹏飞 算法工程师 中国-烟台 2155477673qq.com 团队简介 本人从事工业、互联网场景传统图像算法及深度学习算法开发、部署工作。其中端侧算法开发及部署工作5年时间。 摘要 本文是…...

Vue中的组件通信方式及应用场景

在Vue中&#xff0c;组件通信有以下几种方式&#xff1a; Props / $emit&#xff1a;父组件通过给子组件传递props属性&#xff0c;子组件通过$emit事件将数据传递给父组件。适用于父组件向子组件传递数据。 自定义事件&#xff1a;父组件通过$on监听子组件触发的事件&#xf…...

RA8900CE汽车用c总线接口实时时钟模块

汽车用c总线接口实时时钟模块内置调频32.768 kHz晶体单元和DTCXO&#xff0c;高稳定性和电源切换。 接口类型我 2C-Bus接口(400kHz)界面电压范围2.5V ~ 5.5V温度补偿电压范围2.0V至5.5V计时电压范围1.6V ~ 5.5V可选时钟输出(32.768 kHz, 1024 Hz, 1 Hz)各种功能齐全的日历、报…...

屏幕截图--Snagit

Snagit是一款优秀的屏幕、文本和视频捕获、编辑与转换软件。它不仅可以捕获静止的图像&#xff0c;还能获得动态的图像和声音。软件界面干净清爽&#xff0c;功能板块一目了然&#xff0c;为用户提供专业的屏幕录制方案。可以根据自己的需求调整录制视频的分辨率、帧数、输出格…...

PHP运行环境之宝塔Web站点部署

目录 Web站点部署流程(部署聚合支付后台) 项目文件 将上传的文件解压文件至根目录 修改站点关键信息 设置伪静态,选择:thinkphp,并保存 设置PHP,选择:70+版本即可。 安装网站 1设置运行目录...

使用高版本JDK编译低版本代码

背景 SonarQube运行于Java17&#xff0c;使用Sonar的Maven插件编译时&#xff0c;如果编译使用的JDK版本低于SonarQube使用的Java17&#xff0c;则会提示Java文件不匹配问题。 Error during SonarScanner execution java.lang.UnsupportedClassVersionError: org/sonar/batch/…...

Zuul相关问题及到案(2024)

1、什么是Zuul&#xff1f;它在微服务架构中有什么作用&#xff1f; Zuul是Netflix开源的一种提供API网关服务的应用程序&#xff0c;它在微服务架构中扮演着流量的前门角色。主要功能包括以下几点&#xff1a; 路由转发&#xff1a;Zuul网关将外部请求转发到具体的微服务实例…...

【CSS】讲一讲BFC、IFC、GFC、FFC

1. 前言 FC&#xff08;Formatting Contexts&#xff09;&#xff0c;是CSS2.1的一个概念&#xff0c;是页面中的一块渲染区域&#xff0c;具有一套渲染规则&#xff0c;决定FC中子元素如何定位&#xff0c;以及和其他元素的关系和相互作用。在说FC之前说一下文档流。 1.1. 普…...

阶段十-分布式-任务调度

第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求&#xff0c;在 Java 中开发定时任务主要有三种解决方案&#xff1a;一是使用JDK 自带的 Timer&#xff0c;二是使用 Spring Task&#xff0c;三是使用第三方组件 Quartz Timer 是 JDK 自带的定时任务工具,其…...

Godot4.2——爬虫小游戏简单制作

目录 一、项目 二、项目功能 怪物 人物 快捷键 分数 游戏说明 提示信息 三、学习视频 UI制作 游戏教程 四、总结 一、项目 视频演示&#xff1a;Godot4爬虫小游戏简单制作_哔哩哔哩bilibili 游戏教程&#xff1a;【小猫godot4入门教程 C#版 已完结】官方入门案例 第…...

对象的前世今生与和事佬(static)的故事

目录 1.对象村的秘密&#xff08;对象在内存的实现&#xff09; 1.1 内存的好兄弟“堆”与“栈” 1.1.1方法喜欢玩泰山压顶 1.1.2 stack的实现 1.2栈上的对象引用 1.2.1有关对象局部变量 1.2.2 如果局部变量生存在栈上&#xff0c;那么实例变量呢&#xff1f; 1.2.3创建…...

报错curl: (6) Could not resolve host: raw.githubusercontent...的解决办法

我起初想要在macOS系统安装pip包&#xff0c;首先在终端安装homebrew&#xff0c;敲了命令&#xff1a;/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent...)" 之后触发的报错&#xff0c;报错内容&#xff1a;curl: (6) Could not resolve host: raw.…...

手把手教你学网站建设/网站收录量

原文&#xff1a;http://www.coolketang.com/staticCoding/5a992425128fe1189bdbc7c4.html 1. 本节课将以二维数组为例&#xff0c;演示多维数组的定义和遍历。 2. 首先创建第一个数组&#xff0c;该数组拥有三个整型元素。 3. 接着创建第二个数组&#xff0c;该数组拥有四个整…...

js网站/全媒体运营师报考官网在哪里

http://watashi.ws/blog/1760/zojmonthly1012/转载于:https://www.cnblogs.com/xiazdong/archive/2010/12/26/3058250.html...

wordpress 单页面美化/武汉做seo

A:判决素数个数 题目 总时间限制: 1000ms 内存限制: 65536kB 描述 输入两个整数X和Y&#xff0c;输出两者之间的素数个数&#xff08;包括X和Y&#xff09;。 输入 两个整数X和Y&#xff08;1 < X,Y < 105&#xff09;。 输出 输出一个整数&#xff0c;表示X&…...

系统花钱做任务的小说魅网站/完整的社群营销方案

在业务逻辑比较多的系统里面&#xff0c;一般都会涉及到日期的处理。包括选择起始日期和结束日期&#xff0c;结束日期要大于起始日期&#xff0c;日期的显示和输入等。 输入这一块基本都是使用jQuery datetimepicker&#xff0c;后来系统使用Bootstrap&#xff0c;就开始使用b…...

商标查询官方入口/免费优化网站

1、打 开 新 标 签 页启动 Vim 时用 "vim -p filename ...":tabe[dit]:tabnew 在当前标签页之后打开带空窗口的新标签页。:tabe[dit] [opt] [cmd]:tabnew [opt] [cmd]打开新标签页并编辑 &#xff0c;其余和 |:edit| 类同。:tabf[ind] [opt] [cmd]打开新标签…...

做网站要坚持/南昌seo快速排名

找过网上很多方法和办法发现都不行&#xff0c;后头才发现是浏览器的原理。/汗 <embed src"音乐文件目录要带.mp3" hidden"true" autostart"true" loop"true" />该方法只适用于IE浏览器&#xff0c;我使用80.0.3987.149&#xf…...