java八股文之框架
1.Spring框架中的Bean是否线程安全的
Spring框架中的Bean默认是单例的,不是线程安全的。因为一般在Spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决。
2.说一说AOP
- AOP指面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合
2.AOP的使用场景有记录操作日志,缓存,spring实现的事务都是通过AOP实现的
核心是:使用op中的环绕通知+切点表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取到这些参数以后,根据不同需要进行不同的处理。如:Spring的事务就是方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚。
3.事务失效的情况
- 异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出
- 抛出异常为检查异常,Spring事务默认只会处理运行时异常,可以通过配置rollbackFor属性为Exception解决
- 非public方法导致的事务失效,改为public即可解决
- 当一个类内部的其他方法直接调用时,会发生事务失效情况。这是因为Spring AOP代理机制的原因,直接的方法调用不会经过代理对象,因此事务也不会启动。解决这个问题的一个办法是重构代码,使得事务方法能够被外部访问并由Spring容器来管理调用;另一个是这个类通过懒加载注入自己,再通过注入的代理去调用事务方法即可。
4.说一说Bean的生命周期
- 通过BeanDefinition获取bean的定义信息
- 调用构造函数实例化bean
- 调用了Bean的set方法(属性的依赖注入)
- 调用了Bean实现的Aware接口实现的方法,从前到后为:BeanNameAware(Bean的名称)、BeanFactoryAware(Bean的工厂)、ApplicationContextAware(Bean的上下文)
- Bean的前置处理器BeanPostProcessor-前置方法,在Bean的初始化方法完成前调用
- 自定义初始化方法,从前到后为:@PostConstruct注解的方法、实现了InitializingBean接口的方法
- Bean的后置处理器BeanPostPrpcessor-后置方法,在Bean的初始化方法完成后调用
- 销毁Bean时调用,从前到后为:@PreDestroy注解的方法,实现了DisposableBean接口的destroy()方法
5.说一说循环依赖
循环依赖:
- 循环依赖其实就是循环引用,也就是两个或两个以上的bea互相特有对方,最终形成环。比如A依赖于B,B依赖于A
- 循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖。剩下的可以用@Lazy懒加载解决
三级缓存:
一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
二级缓存:缓存早期的bean对像(生命周期还没走完)
三级缓存,缓存的是ObjectFactory,表示对象工厂,用来创建对象的
6.SpringMvc的执行流程
重点组件:
DispatcherServlet:前端控制器
HandlerMapping:处理器映射器
HandlerAdapter:处理器适配器
ViewReslover:视图解析器
1.视图阶段
- 用户发送出请求到前端控制器(DispatcherServlet)
- 前端控制器收到请求调用处理器映射器(HandlerMapping)
- 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给前端控制器。
- 前端控制器调用处理器适配器(HandlerAdapter)
- 处理器适配器经过适配调用具体的处理器(Handler/Controller)
- 处理器执行完成返ModelAndView对象
- 处理器适配器将处理器(Controller)执行结果ModelAndView返回给前端控制器
- 前端控制器将ModelAndView传给视图解析器(ViewReslover)
- 视图解析器解析后返回具体视图(View)
- 前端控制器根据视图进行渲染视图(即将模型数据填充至视图中),并相应给用户
2.前后端分离阶段
- 用户发送出请求到前端控制器DispatcherServlet
- DispatcherServletu收到请求调用HandlerMapping(处理器映射器)
- HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返给DispatcherServlet。
- DispatcherServleti调用HandlerAdapter(处理器适配器)
- HandlerAdapter经过适配调用具体的处理器(Handler/,Controller)
- 因为方法上有@ResponseBody,所以通过HttpMessageConverter来返回结果转换为JSON并响应
7.说一说SpringBoot自动配置原理
- 在Spring Boot项目中的l导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
- 其中@EnableAutoConfiguration是实现自动化配置的核心注解。该注解通过@Importi注解导入对应的配置选择器,内部就是读取了该项目和该项目引用的jar包的classpath路径下META-lNF/spring.factories.文件中的所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。
- 条件判断会有像@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的执行流程
- 读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件
- 构造会话工厂SqlSessionFactory
- 会话工厂创建SqlSessioni对象(包含了执行SQL语句的所有方法)
- 操作数据库的接口,Executor执行器,同时负责查询缓存的维护
- Executor接口的执行方法里面,会从一个MappedStatement类型的对象里面读取其中封装的映射信息。
- 输入参数映射(java转数据库)
- 输出结果映射(数据库转java)
10.说一说Mybatis延迟加载
- 延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。
- Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载
- 在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=truelfalse,默认是关闭的。或者在mapper文件中局部配置
- 底层原理是使用CGLIB创建目标对象的代理对象。当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sgl查询。获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了。
11.说一说Mybatis缓存
- 一级缓存: 基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存
- 二级缓存: 是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储。需要单独开启,一个是核心配置,一个是mapperB映射文件
- 清理缓存: 当某一个作用域(一级缓存Session,/二级缓存Namespaces)进行了新增、修改、删除操作后,默认该作用域下所有select中的缓存将被clear。
相关文章:
java八股文之框架
1.Spring框架中的Bean是否线程安全的 Spring框架中的Bean默认是单例的,不是线程安全的。因为一般在Spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的…...

【大模型】Ubuntu下 fastgpt 的部署和使用
前言 本次安装的版本为 fastgpt:v4.8.8-fix2。 最新版本fastgpt:v4.8.20-fix2 问答时报错,本着跑通先使用起来,就没有死磕下去,后面bug解了再进行记录。 github连接:https://github.com/labring/FastGPT fastgpt 安装说明&…...
小程序中头像昵称填写
官方文档 参考小程序用户头像昵称获取规则调整公告 新的小程序版本不能通过wx.getUserProfile和wx.getUserInfo获取用户信息 <van-field label"{{Avatar}}" label-class"field-label" right-icon-class"field-right-icon-class"input-class&…...

卷积神经网络(cnn,类似lenet-1,八)
我们第一层用卷积核,前面已经成功,现在我们用两层卷积核: 结构如下,是不是很想lenet-1,其实我们24年就实现了sigmoid版本的: cnn突破九(我们的五层卷积核bpnet网络就是lenet-1)-CS…...

【NLP 27、文本分类任务 —— 传统机器学习算法】
不要抓着枯叶哭泣,你要等待初春的新芽 —— 25.1.23 一、文本分类任务 定义:预先设定好一个文本类别集合,对于一篇文本,预测其所属的类别 例如: 情感分析: 这家饭店太难吃了 —> 正类 …...

Go红队开发—并发编程
文章目录 并发编程go协程chan通道无缓冲通道有缓冲通道创建⽆缓冲和缓冲通道 等协程sync.WaitGroup同步Runtime包Gosched()Goexit() 区别 同步变量sync.Mutex互斥锁atomic原子变量 SelectTicker定时器控制并发数量核心机制 并发编程阶段练习重要的细节端口扫描股票监控 并发编程…...
Oracle 导出所有表索引的创建语句
在Oracle数据库中,导出所有表的索引创建语句通常涉及到使用数据字典视图来查询索引的定义,然后生成对应的SQL语句。你可以通过查询DBA_INDEXES或USER_INDEXES视图(取决于你的权限和需求)来获取这些信息。 使用DBA_INDEXES视图 如…...
使用Docker方式一键部署MySQL和Redis数据库详解
一、前言 数据库是现代应用开发中不可或缺的一部分,MySQL和Redis作为两种广泛使用的数据库系统,分别用于关系型数据库和键值存储。本文旨在通过Docker和Docker Compose的方式,提供一个简洁明了的一键部署方案,确保数据库服务的稳…...

2020年蓝桥杯Java B组第二场题目+部分个人解析
#A:门牌制作 624 解一: 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);} 解二: public static void main(String[] args) {…...

[深度学习] 大模型学习2-提示词工程指北
在文章大语言模型基础知识里,提示词工程(Prompt Engineering)作为大语言模型(Large Language Model,LLM)应用构建的一种方式被简要提及,本文将着重对该技术进行介绍。 提示词工程就是在和LLM聊…...

FPGA之硬件设计笔记-持续更新中
目录 1、说在前面2、FPGA硬件设计总计说明3、 原理图详解 - ARITX - 7 系列3.1 顶层框图介绍3.2 FPGA 电源sheet介绍:3.2.1 bank 14 和 bank 15的供电3.2.2 bank 0的供电3.2.3 Bank34 35 的供电 3.3 核电压和RAM电压以及辅助电压 4 原理图详解-- Ultrascale ARTIX4.…...
vue cli 与 vite的区别
1、现在我们一般会用vite来构建vue3的项目。 2、之前一开始的时候,我们会用vue cli的vue create来构建项目。 3、它们之间有什么区别呢? 1. 设计理念 Vue CLI: 是 Vue.js 官方提供的命令行工具,主要用于快速搭建 Vue 项目。 提…...
怎么在本地环境安装yarn包
一、安装Yarn的前置条件 安装Node.js和npm Yarn依赖于Node.js环境,需先安装Node.js官网的最新稳定版(建议≥16.13.0)。安装时勾选“Add to PATH”以自动配置环境变量。 二、安装Yarn的多种方式 1. 通过npm全局安装(通用…...
【大模型】AI 辅助编程操作实战使用详解
目录 一、前言 二、AI 编程介绍 2.1 AI 编程是什么 2.1.1 为什么需要AI辅助编程 2.2 AI 编程主要特点 2.3 AI编程底层核心技术 2.4 AI 编程核心应用场景 三、AI 代码辅助编程解决方案 3.1 AI 大模型平台 3.1.1 AI大模型平台代码生成优缺点 3.2 AI 编码插件 3.3 AI 编…...

react18自定义hook实现
概念:自定义 hook 是一种将组件逻辑提取到可复用函数中的方式,它允许你在多个组件中共享相同的状态和行为。自定义 hook 的本质上是一个普通的 JavaScript 函数,它可以使用 React 内部的 hook(如 useState、useEffect、useContext…...

一周学会Flask3 Python Web开发-Jinja2模板过滤器使用
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Jinja2中,过滤器(filter)是一些可以用来修改和过滤变量值的特殊函数,过滤器和变量用一个竖线 | &a…...

使用PDFMiner.six解析PDF数据
PDF(可移植文档格式)文件是由Adobe创建的一种灵活的文件格式,它允许文档在不同的软件、硬件和操作系统中一致地显示。每个PDF文件都包含对固定布局文档的全面描述,包括文本、字体、图形和其他必要的显示元素。pdf通常用于文档共享…...
本地svn
参考补充:https://blog.csdn.net/hhl_work/article/details/107832414 先在D:\coding_cangku下新建空文件夹,例:code1【类似gitee线上仓库】点击进入code1,右键选择TortoiseSVN,再下一级菜单下点击Create repository …...

金融支付行业技术侧重点
1. 合规问题 第三方支付系统的平稳运营,严格遵循《非银行支付机构监督管理条例》的各项条款是基础与前提,其中第十八条的规定堪称重中之重,是支付机构必须牢牢把握的关键准则。 第十八条明确指出,非银行支付机构需构建起必要且独…...

axios几种请求类型的格式
Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...