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

java八股文之框架

1.Spring框架中的Bean是否线程安全的

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

2.说一说AOP

  1. AOP指面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合
    2.AOP的使用场景有记录操作日志,缓存,spring实现的事务都是通过AOP实现的
    核心是:使用op中的环绕通知+切点表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取到这些参数以后,根据不同需要进行不同的处理。如:Spring的事务就是方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚。

3.事务失效的情况

  1. 异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出
  2. 抛出异常为检查异常,Spring事务默认只会处理运行时异常,可以通过配置rollbackFor属性为Exception解决
  3. 非public方法导致的事务失效,改为public即可解决
  4. 当一个类内部的其他方法直接调用时,会发生事务失效情况。这是因为Spring AOP代理机制的原因,直接的方法调用不会经过代理对象,因此事务也不会启动。解决这个问题的一个办法是重构代码,使得事务方法能够被外部访问并由Spring容器来管理调用;另一个是这个类通过懒加载注入自己,再通过注入的代理去调用事务方法即可。

4.说一说Bean的生命周期

  1. 通过BeanDefinition获取bean的定义信息
  2. 调用构造函数实例化bean
  3. 调用了Bean的set方法(属性的依赖注入)
  4. 调用了Bean实现的Aware接口实现的方法,从前到后为:BeanNameAware(Bean的名称)、BeanFactoryAware(Bean的工厂)、ApplicationContextAware(Bean的上下文)
  5. Bean的前置处理器BeanPostProcessor-前置方法,在Bean的初始化方法完成前调用
  6. 自定义初始化方法,从前到后为:@PostConstruct注解的方法、实现了InitializingBean接口的方法
  7. Bean的后置处理器BeanPostPrpcessor-后置方法,在Bean的初始化方法完成后调用
  8. 销毁Bean时调用,从前到后为:@PreDestroy注解的方法,实现了DisposableBean接口的destroy()方法

5.说一说循环依赖

循环依赖:

  • 循环依赖其实就是循环引用,也就是两个或两个以上的bea互相特有对方,最终形成环。比如A依赖于B,B依赖于A
  • 循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖。剩下的可以用@Lazy懒加载解决
    三级缓存:
    一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
    二级缓存:缓存早期的bean对像(生命周期还没走完)
    三级缓存,缓存的是ObjectFactory,表示对象工厂,用来创建对象的

6.SpringMvc的执行流程

重点组件:
DispatcherServlet:前端控制器
HandlerMapping:处理器映射器
HandlerAdapter:处理器适配器
ViewReslover:视图解析器

1.视图阶段

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

2.前后端分离阶段

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

7.说一说SpringBoot自动配置原理

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

8.Spring中常见的注解

1.Spring

  • 使用在类上用于实例化Bean
    – @Component
    – @Controller
    – @Service
    – @Repository
  • 使用在字段上用于根据类型依赖注入
    – @Autowired
  • 结合@Autowired一起使用用于根据名称进行依赖注入
    – @Qualifier
  • 标注Bean的作用范围
    – @Scope
  • 指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解
    – @Configuration
  • 用于指定Spring在初始化容器时要扫描的包
    – @ComponentScan
  • 使用在方法上,标注将该方法的返回值存储到Spring容器中
    – @Bean
  • 使用@Import导入的类会被Spring加载到Ioc容器中
    – @Import
  • 用于切面编程(AOP)
    – @Aspect
    – @Before
    – @After
    – @Around
    – @Pointcut

2.SpringMVC

  • 用于映射请求路径,可以定义在类上和方法上。用于类上,则表示类中的所有的方法都是以该地址作为父路径
    – @RequestMapping
  • 注解实现接收http请求的json数据,将json转换为java对象
    – @RequestBody
  • 指定请求参数的名称
    – @RequestParam
  • 从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数
    – @PathViriable
  • 注解实现将controller方法返回对象转化为json对象响应给客户端
    – @ResponseBody
  • 获取指定的请求头数据
    – @RequestHeader
  • @Controller和@ResponseBody合体
    – @RestController

3.SpringBoot

  • 组合了-@Configuration注解,实现配置文件的功能
    – @SpringBootConfiguration
  • 打开自动配置的功能
    – @EnableAutoConfiguration
  • @ComponentScan
    – Spring组件扫描

9.Mybatis的执行流程

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

10.说一说Mybatis延迟加载

  1. 延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。
  2. Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载
  3. 在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=truelfalse,默认是关闭的。或者在mapper文件中局部配置
  4. 底层原理是使用CGLIB创建目标对象的代理对象。当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sgl查询。获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了。

11.说一说Mybatis缓存

  1. 一级缓存: 基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存
  2. 二级缓存: 是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储。需要单独开启,一个是核心配置,一个是mapperB映射文件
  3. 清理缓存: 当某一个作用域(一级缓存Session,/二级缓存Namespaces)进行了新增、修改、删除操作后,默认该作用域下所有select中的缓存将被clear。

相关文章:

java八股文之框架

1.Spring框架中的Bean是否线程安全的 Spring框架中的Bean默认是单例的,不是线程安全的。因为一般在Spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的&#xf…...

R语言+AI提示词:贝叶斯广义线性混合效应模型GLMM生物学Meta分析

全文链接:https://tecdat.cn/?p40797 本文旨在帮助0基础或只有简单编程基础的研究学者,通过 AI 的提示词工程,使用 R 语言完成元分析,包括数据处理、模型构建、评估以及结果解读等步骤(点击文末“阅读原文”获取完整代…...

2020年蓝桥杯Java B组第二场题目+部分个人解析

#A&#xff1a;门牌制作 624 解一&#xff1a; public static void main(String[] args) {int count0;for(int i1;i<2020;i) {int ni;while(n>0) {if(n%102) {count;}n/10;}}System.out.println(count);} 解二&#xff1a; public static void main(String[] args) {…...

【Azure 架构师学习笔记】- Azure Databricks (13) -- 搭建Medallion Architecture part 1

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (12) – Medallion Architecture简介 前言 上文已经介绍了关于Medallion的知识&#xff0c;本文开始用ADB 来实现&#xff0c; 但是基于内容较…...

2025年2月21日优雅草内测分发站全新升级-测试运营-优雅草内测分发站新用户提供免费100下载点-2月28日正式运营并且提供私有化部署版本

2025年2月21日优雅草内测分发站全新升级-测试运营-优雅草内测分发站新用户提供免费100下载点-2月28日正式运营并且提供私有化部署版本 说明 优雅草内测分发站新用户提供免费100下载点&#xff0c;优雅草分运营站和demo测试站 运营站&#xff1a;www.youyacao.cn 提供免费100…...

通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句

问题描述 在使用 LangChain 和 Llama 模型生成 SQL 查询时&#xff0c;遇到了 sqlite3.OperationalError 错误。错误信息如下&#xff1a; OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …...

本地部署Embedding模型API服务的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...

IP段转CIDR:原理Java实现

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

[STM32]从零开始的STM32 DEBUG问题讲解及解决办法

一、前言 最近也是重装了一次keil&#xff0c;想着也是重装了&#xff0c;也是去官网下载了一个5.41的最新版&#xff0c;在安装和配置编译器和别的版本keil都没太大的区别&#xff0c;但是在调试时&#xff0c;遇到问题了&#xff0c;在我Debug的System Viewer窗口中没有GPIO&…...

MySQL当中的Lock

1. 总览锁的类型 锁的类型&#xff1a; 锁类型 符号/缩写 描述 全局锁 FTWRL 锁定整个数据库&#xff08;FLUSH TABLES WITH READ LOCK&#xff09;&#xff0c;用于全库备份。 表级锁 - 表锁 S/X LOCK TABLES ... READ&#xff08;共享锁&#xff09;或 WRITE&#…...

electron-builder打包时github包下载失败【解决办法】

各位朋友们&#xff0c;在使用electron开发时&#xff0c;选择了electron-builder作为编译打包工具时&#xff0c;是否经常遇到无法从github上下载依赖包问题&#xff0c;如下报错&#xff1a; Get "https://github.com/electron/electron/releases/download/v6.1.12/ele…...

【免费】YOLO[笑容]目标检测全过程(yolo环境配置+labelimg数据集标注+目标检测训练测试)

一、yolo环境配置 这篇帖子是我试过的&#xff0c;非常全&#xff0c;很详细【cudaanacondapytorchyolo(ultralytics)】 yolo环境配置 二、labelimg数据集标注 可以参考下面的帖子&#xff0c;不过可能会出现闪退的问题&#xff0c;安装我的流程来吧 2.1 labelimg安装 label…...

服务器禁止操作汇总(Server Prohibits 0peration Summary)

服务器禁止操作汇总 一、禁忌操作TOP10 1. 直接断电关机 &#x1f4a5; 血泪案例&#xff1a;某物流公司运维拔电源强制关机&#xff0c;导致数据库事务中断&#xff0c;20万订单状态丢失。 &#x1f4cc; 技术解析&#xff1a; • 直接断电可能引发&#xff1a; ✅ 文件系统…...

UE5 Slate类的基础创建

创建一个slate类的基础代码 #pragma onceclass SCustomDetailPlane : public SCompoundWidget {SLATE_BEGIN_ARGS(SCustomDetailPlane){}SLATE_END_ARGS()public:SCustomDetailPlane();~SCustomDetailPlane();void Construct(const FArguments& InArgs);};***************…...

springboot2.7.18升级springboot3.3.0遇到的坑

druid的警告&#xff0c;警告如下&#xff1a; 运行警告2025-02-28T09:20:31.28508:00 WARN 18800 --- [ restartedMain] trationDelegate$BeanPostProcessorChecker : Bean com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidSpringAopConfiguration of type [com.a…...

服务器IPMI用户名、密码批量检查

背景 大规模服务器部署的时候&#xff0c;少不了较多的网管和监测平台&#xff0c;这些平台会去监控服务器的性能、硬件等指标参数&#xff0c;为了便于管理和控制&#xff0c;则需要给服务器IPMI带外管理添加较多的用户&#xff0c;这就需要对较多的服务器检查所对应的IPMI用…...

JAVA面试_进阶部分_netty面试题

1.BIO、NIO 和 AIO 的区别&#xff1f; BIO&#xff1a;一个连接一个线程&#xff0c;客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 伪异步 IO&#xff1a;将请求连接放入线程池&#xff0c;一对多&#xff0c;但线程还是很宝贵的资源。 NIO&#x…...

小红书湖仓架构的跃迁之路

作者&#xff1a;李鹏霖(丁典)&#xff0c;小红书-研发工程师&#xff0c;StarRocks Contributor & Apache Impala Committer 本文整理自小红书工程师在 StarRocks 年度峰会上的分享&#xff0c;介绍了小红书自助分析平台中&#xff0c;StarRocks 与 Iceberg 结合后&#x…...

C++-第十七章:包装器

目录 第一节&#xff1a;std::function 第二节&#xff1a;std::bind 2-1.基本介绍 2-2.调整顺序(不常用) 2-3.调整个数 2-4.std::bind与std::function 下期预告&#xff1a; C中有3种可调用对象&#xff1a;函数指针、仿函数对象、lambda函数&#xff0c;经过包装器包装后屏…...

如何判断邮件列表中邮箱地址的有效性?

判断邮件列表中邮箱地址的有效性&#xff0c;对于提高邮件送达率、避免资源浪费和维护发件人信誉至关重要。以下是一些实用的判断方法&#xff1a; 一、使用专业的邮箱验证工具 市面上有许多专业的邮箱验证工具&#xff0c;如 Geeksend邮箱验证工具 等。这些工具通过与邮件服…...

翻译: 深入分析LLMs like ChatGPT 二

监督微调&#xff08;SFT&#xff09; 使用人工标注的对话数据集&#xff08;如1M条"用户-助手"对话&#xff09;继续训练模型。 标注员遵循指导原则编写理想回答&#xff0c;使模型学习助手的回应风格。 示例对话格式&#xff1a; [系统] 你是一个有帮助的AI助手……...

conda怎么迁移之前下载的环境包,把python从3.9升级到3.10

克隆旧环境&#xff08;保留旧环境作为备份&#xff09; conda create -n cloned_env --clone old_env 在克隆环境中直接升级 Python conda activate cloned_env conda install python3.10 升级 Python 后出现 所有包导入失败 的问题&#xff0c;通常是因为依赖包与新 Pyth…...

k8s之pod的调度之污点与容忍污点,什么是污点? 如何容忍污点

在 Kubernetes 中&#xff0c;污点&#xff08;Taint&#xff09; 和 容忍&#xff08;Toleration&#xff09; 是用于控制 Pod 调度到特定节点的重要机制。污点允许节点拒绝某些 Pod 的调度&#xff0c;而容忍则允许 Pod 忽略节点的污点&#xff0c;从而调度到特定节点上。 1.…...

Linux切换Python版本

1、更新apt sudo apt update2、查询python安装路径 which python 或者which python33、查询安装版本 # 查看所有以 "python" 开头的命令&#xff08;包括版本号&#xff09; ls -l 安装路径* 例如 ls -l /usr/bin/python*4、修改软连接 udo unlink /usr/bin/pyt…...

TCP的三次握手与四次挥手:建立与终止连接的关键步骤

引言 ‌TCP&#xff08;传输控制协议&#xff09;工作在OSI模型的传输层‌。OSI模型将计算机网络功能划分为七个层级&#xff0c;从底层到顶层依次是&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…...

2025计算机考研复试资料(附:网课+历年复试真题+140所高校真题+机试)

目录 2025 计算机考研复试经验全攻略&#xff0c;附超全资源&#x1f381; &#xff08;一&#xff09;网课资源 &#xff08;二&#xff09;历年复试真题 &#xff08;三&#xff09;140 所高校真题 二、专业知识复习篇 &#xff08;一&#xff09;复试专业课程 二&…...

Milvus高性能向量数据库与大模型结合

Milvus | 高性能向量数据库&#xff0c;为规模而构建Milvus 是一个为 GenAI 应用构建的开源向量数据库。使用 pip 安装&#xff0c;执行高速搜索&#xff0c;并扩展到数十亿个向量。https://milvus.io/zh Milvus 是什么&#xff1f; Milvus 是一种高性能、高扩展性的向量数据…...

【Groovy】流程控制

1 选择结构 Groovy 中选择结构主要包含 if -else、switch 语句&#xff0c;并且可以返回结果。 1.1 if-else def score 85 if (score > 90) {println("优秀") } else if (score > 80) {println("良好") } else if (score > 60) {println("…...

腾讯游戏完成架构调整 IEG新设五大产品事业部

易采游戏网2月28日独家消息&#xff1a;继1月份腾讯天美工作室群完成内部组织架构调整后&#xff0c;腾讯旗下互动娱乐事业群&#xff08;IEG&#xff09;再次宣布对组织架构进行优化调整。此次调整的核心在于新设立了五大产品事业部&#xff0c;包括体育产品部、音舞产品部、V…...

达梦数据库系列之安装及Mysql数据迁移

达梦数据库系列之安装及Mysql数据迁移 1. 达梦数据库1.1 简介1.2 Docker安装达梦1.2.1 默认密码查询1.2.2 docker启动指定密码 1.3 达梦数据库连接工具1.3.1 快捷键 2 Mysql数据库迁移至达梦2.1 使用SQLark进行数据迁移 1. 达梦数据库 1.1 简介 DM8是达梦公司在总结DM系列产品…...