JavaEE 面试常见问题
一、常见的 ORM 框架有哪些?
1.Mybatis
1. 因为由程序员自己写 SQL ,相对来说学习门槛更低,更容易入门。2. 更方便做 SQL 的性能优化及维护。3. 对关系型数据库的模型要求不高,这样在做数据库模型调整时,影响不会太大。适合软件需求变更比较频繁的系统,因此国内系统大部分都是使用如 Mybatis 这样的半自动 ORM 框架。
不能跨数据库,因为写的 SQL 可能存在某数据库特有的语法或关键词
2.Hibernate
1. 全自动 ORM 框架,自动的组装为 SQL 语句。2. 可以跨数据库,框架提供了多套主流数据库的 SQL 生成规则。
学习门槛更高,要学习框架 API 与 SQL 之间的转换关系对数据库模型依赖非常大,在软件需求变更频繁的系统中,会导致非常难以调整及维护。可能数据库中随便改一个表或字段的定义,Java 代码中要修改几十处。很难定位问题,也很难进行性能优化:需要精通框架,对数据库模型设计也非常熟悉。
二、Bean容器/Ioc容器的理解
1. BeanFactory 是最底层的容器接口,只提供了最基础的容器功能: Bean 的实例化和依赖注入,并且使用懒加载的方式,这意味着 beans 只有在我们通过 getBean() 方法直接调用它们时才进行实例化。2. ApplicationContext (应用上下文)是 BeanFactory 的子接口,与 BeanFactory 懒加载的方式不同,它是预加载,所以,每一个 bean 都在 ApplicationContext 启动之后实例化。3. 除了基础功能,还添加了很多增强:
- 整合了Bean的生命周期管理
- i18n国际化功能(MessageSource)
- 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的 web层
- 事件发布响应机制(ApplicationEventPublisher)
- AOP
三、IoC/DI的理解
概念
实现方式
实现原理
四、Spring中的单例bean的线程安全问题
1. 在 bean 对象中尽量避免定义可变的成员变量(不太现实)。2. 在类中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。
五、Spring中的bean的作用域有哪些?
1.singleton :唯一 bean 实例, Spring 中的 bean 默认都是单例的。2.prototype :每次请求都会创建一个新的 bean 实例。3.request :每一次 HTTP 请求都会产生一个新的 bean ,该 bean 仅在当前 HTTP request 内有效。4.session :每一次 HTTP 请求都会产生一个新的 bean ,该 bean 仅在当前 HTTP session 内有效。5.application :在一个应用的 Servlet 上下文生命周期中,产生一个新的 bean6.websocket :在一个 WebSocket 生命周期中,产生一个新的 Bean
六、FactoryBean和BeanFactory
七、Bean的生命周期
1. 实例化 Bean :通过反射调用构造方法实例化对象。2. 依赖注入:装配 Bean 的属性3. 实现了 Aware 接口的 Bean ,执行接口方法:如顺序执行 BeanNameAware 、 BeanFactoryAware 、 ApplicationContextAware的接口方法。4. Bean 对象初始化前,循环调用实现了 BeanPostProcessor 接口的预初始化方法 (postProcessBeforeInitialization )5. 执行 Bean 对象初始化方法6. Bean 对象初始化后,循环调用实现了 BeanPostProcessor 接口的后初始化方法( postProcessAfterInitialization )7. 容器关闭时,执行 Bean 对象的销毁方法
八、Spring三级缓存的理解
什么是循环依赖
@Component
public class A{
@Autowired
private B b;
}
@Component
public class B{
@Autowired
private A a;
}
Bean的生命周期回顾
1. 启动容器:加载 Bean2. 实例化 Bean 对象3. 依赖注入:装配 Bean 的属性4. 初始化 Bean :执行 aware 接口方法、预初始化方法、初始化方法、后初始化方法5. 关闭容器:销毁 Bean

循环依赖的问题
1. 容器中没有 A 对象,实例化 A 对象2. 装配 A 中的 B 对象,发现 B 在容器中没有,需要先实例化 B3. 实例化 B 对象4. 装配 B 中的 A 对象,发现 A 在容器中没有,需要先实例化 A5. 重复第一个步骤

- Bean会依赖某些注入的Bean来完成初始化工作
- 由于Spring支持构造方法注入,属性/Setter注入的方式,所以不能简单的先把所有对象全部实例化,放到缓存中,再全部执行初始化。原因很简单,此时所有对象的引用都可以获取到,但属性都是null,执行初始化甚至构造方法都可能出现空指针异常。
Spring支持的循环依赖
- 原型模式(prototype)的Bean:原因很好理解,创建新的A时,发现要注入原型字段B,又创建新的B发现要注入原型字段A... 还是典型的套娃行为...
- 基于构造器的循环依赖,就更不用说了,官方文档都摊牌了,你想让构造器注入支持循环依赖,是不存在的,不如把代码改了。
Spring解决循环依赖

三级缓存的源码见 DefaultSingletonBeanRegistry :
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
SingletonBeanRegistry {
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>
(256);
/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new
HashMap<>(16);
/** Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new
ConcurrentHashMap<>(16);
}
- 三级缓存singletonFactories中保存的是ObjectFactory对象(Bean工厂),其中包含了 BeanName,Bean对象,RootBeanDefinition,该工厂可以生成Bean对象。
- 由于Bean可能被代理,此时注入到其他Bean属性中的也应该是代理Bean。

为什么要使用三级缓存
- 普通的IoC容器使用一级缓存即可,但无法解决循环依赖问题。
- 解决循环依赖问题:使用二级缓存即可。一级缓存保存完整Bean,二级缓存保存提前曝光的不完 整的Bean。
- 需要AOP代理Bean时,有两种实现思路: (1)再加一级缓存 (2)只使用二级缓存,其中二级缓存保存Bean的代理对象,代理对象中引用不完整的原始对象即可。
- Spring使用三级缓存保存ObjectFactory即Bean工厂,在代码的层次设计及扩展性上都会更好。 ps:ObjectFactory内部可以根据 SmartInstantiationAwareBeanPostProcessor 这样的后置处 理器获取提前曝光的对象。
九、AOP的理解
- JDK动态代理:需要被代理类实现接口,使用 InvocationHandler 和 Proxy 动态的生成代理类
- CGLIB动态代理:需要被代理类能被继承,不能被final修饰。使用 MethodInterceptor 来对方法拦截。CGLIB底层是基于ASM字节码框架,在运行时动态生成代理类
- 前置通知 使用@Before:通知方法会在目标方法调用之前执行。
- 后置通知 使用@After:通知方法会在目标方法返回或者抛出异常后调用。
- 返回之后通知 使用@AfterReturning:通知方法会在目标方法返回后调用。
- 抛异常后通知 使用@AfterThrowing:通知方法会在目标方法抛出异常后调用。
- 环绕通知 使用@Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。
十、Spring事务中的隔离级别有哪几种?
- ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ 隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。
- ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
- ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
十一、Spring事务中有哪几种事务传播行为?
- PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。
- PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。
12.SpringMVC的流程
- 第一步:(发起)发起请求到前端控制器(DispatcherServlet)
- 第二步:(查找)前端控制器请求HandlerMapping查找 Handler(可以根据xml配置、注解进行查找)
- 第三步:(返回)处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping 会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略
- 第四步:(调用)前端控制器调用处理器适配器去执行Handler
- 第五步:(执行)处理器适配器HandlerAdapter将会根据适配的结果去执行Handler
- 第六步:(返回)Handler执行完成给适配器返回ModelAndView
- 第七步:(接收)处理器适配器向前端控制器返回ModelAndView (ModelAndView是
- SpringMVC框架的一个底层对象,包括 Model和view)
- 第八步:(解析)前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图 (jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
- 第九步:(返回)视图解析器向前端控制器返回View
- 第十步:(渲染)前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
- 第十一步:(响应)前端控制器向用户响应结果
以下是对出现的一些组件的介绍:(1) 前端控制器 DispatcherServlet (不需要程序员开发)。作用:接收请求,响应结果,相当于转发器,中央处理器。有了 DispatcherServlet 减少了其它组件之间的耦合度。(2) 处理器映射器 HandlerMapping (不需要程序员开发)。作用:根据请求的 url 查找 Handler 。(3) 处理器适配器 HandlerAdapter (不需要程序员开发)。作用:按照特定规则( HandlerAdapter 要求的规则)去执行 Handler 。(4) 处理器 Handler (需要程序员开发)。注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可以去正确执行 Handler(5) 视图解析器 ViewResolver (不需要程序员开发)。作用:进行视图解析,根据逻辑视图名解析成真正的视图( view )(6) 视图 View (需要程序员开发 jsp )。注意: View 是一个接口,实现类支持不同的 View 类型( jsp 、 freemarker 、 pdf… )
十三、Mybatis中,#{}和${}的区别
- #{变量名} 是预处理替换的方式,本质是 jdbc 中占位符的替换。如传入字符串,会替换为带单引号的值。可以安全性更好,
- ${变量名} 是字符串的替换,只是对 sql 字符串进行拼接。如传入字符串,会直接替换为字符串的值,不加单引号。
十四、Mybatis中如何一对一、一对多关联
十五、SpringBoot 自动配置原理

相关文章:

JavaEE 面试常见问题
一、常见的 ORM 框架有哪些? 1.Mybatis Mybatis 是一种典型的半自动的 ORM 框架,所谓的半自动,是因为还需要手动的写 SQL 语句,再由框架根据 SQL 及 传入数据来组装为要执行的 SQL 。其优点为: 1. 因为由程序员…...

06 HTTP(下)
06 HTTP(下) 介绍服务器如何响应请求报文,并将该报文发送给浏览器端。介绍一些基础API,然后结合流程图和代码对服务器响应请求报文进行详解。 基础API部分,介绍stat、mmap、iovec、writev。 流程图部分,描…...

clickhouse调研报告2
由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…...

TensorRT学习笔记--基于TensorRT部署YoloV3, YoloV5和YoloV8
目录 1--完整项目 2--模型转换 3--编译项目 4--序列化模型 5--推理测试 1--完整项目 以下以 YoloV8 为例进行图片和视频的推理,完整项目地址如下:https://github.com/liujf69/TensorRT-Demo git clone https://github.com/liujf69/TensorRT-Demo.…...

原型链污染,nodejs逃逸例子
文章目录 原型链污染原型链污染原理原型链污染小例子 原型链污染题目解析第一题第二题 Nodejs沙箱逃逸方法一方法二 原型链污染 原型链污染原理 原型链 function test(){this.a test; } b new test;可以看到b在实例化为test对象以后,就可以输出test类中的属性a…...

nlohmann::json 中文乱码解决方案
// UTF8字符串转成GBK字符串 std::string U2G(const std::string& utf8) {int nwLen MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);wchar_t* pwBuf new wchar_t[nwLen 1];//加1用于截断字符串 memset(pwBuf, 0, nwLen * 2 2);MultiByteToWideChar(CP_U…...

IDEA中maven项目失效,pom.xml文件橙色/橘色
IDEA中maven项目失效,pom.xml文件橙色/橘色 IDEA中Maven项目失效 IDEA中创建的maven项目中的文件夹都变成普通格式,pom.xml变成橙色 右键点击橙色的pom.xml文件,选择add as maven project maven项目开始重新导入相应依赖,恢复…...

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 2
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...

IntelliJ IDEA 2023.2社区版插件汇总
参考插件帝:https://gitee.com/zhengqingya/java-developer-document 突发小技巧:使用插件时要注意插件的版本兼容性,并根据自己的实际需求选择合适的插件。同时,不要过度依赖插件,保持简洁和高效的开发环境才是最重要…...

Sheel编写关于mysqldump实现分库分表备份
编写脚本,使用mysqldump实现分库分表备份。 #编辑脚本文件 [rootlocalhost scripts]# vim bak_tb1.sh#脚本内容: #设置变量,减少代码冗余 mysql_cmd-uroot -p123 exclude_dbDatabase|information_schema|-S|mysql|performance_schema|sys ba…...

Rust的入门篇(上)
Rust的入门篇(上) 最近跟着菜鸟一起入门了比较火的Rust语言,下面整理一下学习的笔记吧。 1. Helloworld程序 fn main(){println!("hello rust") }2. 格式化字符串 fn main(){let a 12;// 格式化字符串println!("a{}", a);println!("a…...

数字滚动变化-指令形式
话不多说,直接上代码 <template><divv-data-scroll"{target: 100speed: 1000}">100</div> </template><script setup lang"ts"> import { DirectiveBinding } from vue;function dataScroll(el: HTMLElement, …...

LNMP搭建及论坛搭建
一、LNMP LNMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件, 能够提供动态Web站点服务及其应用开发环境。LNMP是一个缩写词,具体包括Linux操作系统、nginx网站服务器、MySQL数据库服务器、PHP(或…...

小程序商品如何开启秒杀?
在小程序中,开启秒杀活动可以有效地吸引用户的注意力,提升销售额。下面就让我们来看看小程序商品怎么开启秒杀功能吧。 首先,确定秒杀活动的商品。一般来说,我们可以选择一些库存较多的商品或者是需要清理库存的商品作为秒杀商品…...

vue 标题文字字数过长超出部分用...代替 动态显示
效果: 浏览器最大化: 浏览器缩小: 代码: html: <div class"title overflow">{{item.name}}</div> <div class"content overflow">{{item.content}}</div> css: .overflow {/* 一定要加宽度 */width: 90%;/* 文字的大小 */he…...

DAY2,C高级(shell脚本的使用)
1.今日思维导图; 2.递归实现,输入一个数,输出这个数的每一位; #include<my_head.h>void Output(int num) {if(num 0)return;Output(num/10);printf("%d ",num%10);}int main(int argc, const char *argv[]) {in…...

maven中的properties标签
在maven构建项目的时候经常遇到如下所示的标签配置: <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId> <version>4.2.6</version></dependency><dependency><gr…...

[openCV]基于拟合中线的智能车巡线方案V2
import cv2 as cv import os import numpy as np# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir:文件夹根目录输入 ext: 扩展名返回: 文件路径列表"""newDir d…...

软件测试环境讲解
在一个项目开发到发布的整个过程中,会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上,配置好以后,跑起来项目,…...

mysql 面试
基础 详细说一下一条 MySQL 语句执行的步骤 Server 层按顺序执行 SQL 的步骤为: 客户端请求 -> 连接器(验证用户身份,给予权限) 查询缓存(存在缓存则直接返回,不存在则执行后续操作) 分析器…...

linux 安装FTP
检查是否已经安装 $] rpm -qa |grep vsftpd vsftpd-3.0.2-29.el7_9.x86_64出现 vsftpd 信息表示已经安装,无需再次安装 yum安装 $] yum -y install vsftpd此命令需要root执行或有sudo权限的账号执行 /etc/vsftpd 目录 ftpusers # 禁用账号列表 user_list # 账号列…...

软考高项(六)项目管理概述 ★重点集萃★
👑 个人主页 👑 :😜😜😜Fish_Vast😜😜😜 🐝 个人格言 🐝 :🧐🧐🧐说到做到,言出必行&am…...

【vue】组件使用教训
组件使用 报错组件找不到 These dependencies were not found: 遇见的问题 在使用vue的时候,做了一个统计图的功能,引入了chart。 但是在运行项目的时候,直接报错启动不起来,报错内容是 告诉我依赖找不到,然后还试…...

2023年华数杯数学建模B题思路代码分析 - 不透明制品最优配色方案设计
# 1 赛题 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此,不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而,传统的人工配色 存在一定的局限性,如主观性强、效率低下等。因此…...

百度飞桨助力高校培养AI大模型人才,2023年飞桨产学合作项目申报启动
7月7日,教育部产学合作协同育人项目公布项目指南通过的企业名单,百度被列入2023年(5月)批次名单;其中百度飞桨与文心大模型项目40个,包含教学内容和课程体系改革、实践条件和实践基地建设、师资培训项目三大…...

【NLP概念源和流】 02-稠密文档表示(第 2/20 部分)
接续前文 【NLP初级概念】 01-稀疏文档表示(第 1/30 部分)_无水先生的博客-CSDN博客 一、说明 在前文中,我们已经了解如何为文档创建像“TF-IDF”和“BoW”这样的稀疏向量,其维度对应于语料库词汇表中的单词(这个维度将是巨大的)。在这篇博客中,我们将看到如何使用降维…...

同构多核架构(SMP)和异构多核架构(AMP)
同构多核架构(SMP)和异构多核架构(AMP)主要在两个角度上有区别: 处理器架构:在同构多核架构中,系统中的处理器在架构上是相同的,而异构多核架构则包含不同架构的处理器。运行模式&a…...

【网络基础进阶之路】一文弄懂TCP的三次握手与四次断开
系列文章: 【网络基础进阶之路】路由器间的静态综合详解 文章目录: 一、TCP协议 二、三次握手——建立连接 三、四次断开——结束连接 一、TCP协议 TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端…...

VUE框架、UNIAPP框架:vue2转vue3全面细节总结(1)vue框架:路由模式、路由跳转;uniapp框架:存储数据写法、引入数据写法;
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人_python人工智能视觉(opencv)从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了: https://blog.csdn.net/lbcy…...

GIS在地质灾害危险性评估与灾后重建中的应用教程
详情点击链接:GIS在地质灾害危险性评估与灾后重建中的实践技术应用 前言 地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下,地质…...