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
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是线程安全的吗? 所谓单例就是所有的请求都用一个对象来处理,而多例则指每个请求用一个新的对象来处理。 结论:线程不安全。 Spring框架中有一个Scope注解,默认的值就是singleton,单例的。一…...
GO语言笔记1-安装与hello world
SDK开发工具包下载 Go语言官网地址:golang.org,无法访问Golang中文社区:首页 - Go语言中文网 - Golang中文社区下载地址:Go下载 - Go语言中文网 - Golang中文社区 尽量去下载稳定版本,根据使用系统下载压缩包格式的安装…...
指针传参误区
C语言中指针作为形参传递时,func(*a, *b) 这种形式的话,是无法通过简单的 ab来修改的,在函数体内a的地址确实被修改成b的地址了,但是当函数执行结束时,a的地址会重新回到原本的地址里面…...
力扣-42.接雨水
题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组[0,1,0,2…...
LeetCode-移动零(283)
题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 思路: 这里的思路跟以前做过的去重复数字的思路有点像&…...
文件系统与日志分析
一,文件系统 (一)inode 和block概述 1,文件数据包括元信息与实际数据 2,文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节 3,block (块) 连续的八个扇区组成一…...
labview 与三菱FX 小型PLC通信(OPC)
NI OPC服务器与三菱FX3U PLC通讯方法 一、新建通道名称为:MIT 二、选择三菱FX系列 三、确认端口号相关的参数(COM端:7.波特率:9600,数据位:7,校验:奇校验,停止位…...
掌握Linux网络配置:价格亲民,操作简便!
前言 在Linux系统中,网络配置是实现连接、通信和安全的重要一环。无论你是初学者还是有经验的用户,掌握网络配置命令能帮助你轻松管理网络接口、设置IP地址以及查看连接状态。以下是一些关键命令和示例,让你快速掌握网络操作的精髓ÿ…...
郑州大学算法设计与分析实验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项目,安装 CMake 插件 CMakeCMake ToolsCMake Language Support (建议,语法提示) 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中,computed和watch都是用于监听数据的变化,并且根据变化做出相应的反应。 computed是一个计算属性,它会根据依赖的数据的变化自动计算得出一个新的值,并且具有缓存的特性。当依赖的数据发生变化时,computed属性…...
gephi——graphviz插件设置
gephi_graphviz插件设置 以下是我总结出来的一点经验 1. 安装graphviz软件,请见作者其他博客 2. 安装gephi 插件,并激活 3. 运行graphviz布局,会遇到找不到dot问题 问题描述:Graphviz process error X There was an error launc…...
wireshark抓包分析HTTP协议,HTTP协议执行流程,
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 使用WireShark工具抓取「HTTP协议」的数据包&#…...
Linux第13步_安装“vim编辑器”及应用介绍
学习“磁盘重新分区”后,嵌入式Linux系统环境搭建进入安装“vim编辑器”这个环节。vim编辑器可以用来修改文件,在后期使用中,会经常用到。 1、安装“vim编辑器” 输入“sudo apt-get install vim回车”,就可以执行安装“vim编辑…...
Yapi安装配置(CentOs)
环境要求 nodejs(7.6) mongodb(2.6) 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协议升级路由器软件时,传输模式应该选用___ 二进制模式 字节模式 文字模式 流字节模式 解析:二进制模式:在数据连接中传输,不对数据进行任何处理,不需要转换或格式化就可以传输字符。 2.以…...
【开源GPT项目 - 在问】让知识无界,智能触手可及
Chatanywhere: chatAnywhere 在问 | 让知识无界,智能触手可及 项目简介 这是一个免费的在线聊天工具,旨在让用户更方便地享受科技带来的便利。用户可以使用我们的工具来获取答案、寻求建议、进行翻译和计算等等。这是由一位个人开发者创建的ÿ…...
【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于Real-ESRGAN的TPU超分模型部署
2023 CCF 大数据与计算智能大赛 《基于TPU平台实现超分辨率重建模型部署》 洋洋很棒 李鹏飞 算法工程师 中国-烟台 2155477673qq.com 团队简介 本人从事工业、互联网场景传统图像算法及深度学习算法开发、部署工作。其中端侧算法开发及部署工作5年时间。 摘要 本文是…...
Vue中的组件通信方式及应用场景
在Vue中,组件通信有以下几种方式: Props / $emit:父组件通过给子组件传递props属性,子组件通过$emit事件将数据传递给父组件。适用于父组件向子组件传递数据。 自定义事件:父组件通过$on监听子组件触发的事件…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
