Java 面试题之框架

1. Spring 是什么

Sping 是包含了众多工具方法的 IOC 容器,IOC是控制反转,说的是对象的创建和销毁的权利都交给 Spring 来管理了, 它本身又具备了存储对象和获取对象的能力. 

容器:字面意思,用来容纳某种物品的装置。

比如 List/Map -》数据存储容器;Tomcat -》web容器;

而 Spring 也是一个容器,Spring 是一个 IOC 容器:

那么 IOC 是什么呢

IOC 就是控制反转,也就是 Spring 是一个 控制反转 的容器。

控制反转:之前的控制权是在我,现在反转了,也就是我把控制权交给了框架,下次我再要使用对象的时候,只需要告诉框架,我要使用这个对象。所以现在这个对象的生命周期我就不在关注了。

IOC 优点:实现代码的解耦,

Spring IoC 容器最核心的功能:

将 Bean (对象) 存储到 Spring (容器) 中
将 Bean (对象) 从 Spring (容器) 中取出来 
Spring 的特点:轻量级、控制反转、AOP、声明式事务管理(注解或XML)、框架整合、测试支持。

2. 依赖注入和依赖查找的区别

区别:依赖注入是将依赖关系委托给容器,由容器来管理对象之间的依赖关系;

而依赖查找是由对象自己来查找它所依赖的对象,容器只负责管理对象的生命周期。

3. DI 和 IOC 的区别是什么

对于 Spring 容器来说:

IOC是一种思想:控制反转,定义了对象创建和依赖关系处理的方式;

DI是一种实现:依赖注入,实际提供对象依赖关系的注入功能;

4. ApplicationContext 和 BeanFactory 的区别

相同点:ApplicationContext 和 BeanFactory 效果是⼀样的, 都可以实现从容器中获取 bean,都提供了 getBean 的方法.

不同点:

从继承关系和功能方面来看: BeanFactory 提供了基础的访问容器的能力,

而 Application 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能外,它还拥有独特的特性,还添加了对国际化支持,资源访问支持,以及事件传播等方面的支持.

从性能方面来看: Application 是一次加载并初始化所有的 Bean 对象(饿汉方式),

而 BeanFactory 是需要哪个才去加载哪个,所以更加的轻量(懒汉方式)

5. Sping 存储 Bean 对象的五大注解

  1. Controller 控制存储
  2. Service 服务存储
  3. Repository 仓库存储
  4. Configuration 配置存储
  5. Component 组件存储

6. Bean 对象的注入方式,以及有什么区别

  1. 属性注入:写法简单,所以日常使用频率最高,但只适用于IOC容器,通用性不好;
  2. 构造方法注入:从 Spring 3.4 后官方推荐的是构造方法注入,它可以注入不可变对象,并且能保证注入的对象一定是初始化过的,其通用性也更好。
  3. setter 注入:Spring 官方从3.4 之后就不推荐这种写法了,其通用性没构造方法注入通用;

7. @AutoWired 和 @Resource 的区别

相同点:都可以实现将一个对象注入到类中;

不同点:

出身不同:@Resource 来自于 JDK 中,@AutoWired 来自于 Spring 框架;

用法不同:@Resource 用于 属性注入/Setter 注入,@AutoWired 用于 属性注入/构造方法注入/Setter 注入;

支持的参数不同:@Resource 支持更多的参数设置 name/type....,而 @AutoWired 只支持 required 参数设置;

8. AutoWired 底层是如何实现的

Spring 中 @AutoWired 注解是通过 DI(依赖注入)实现的;

可以理解为,当 Spring 容器启动时,它会扫描应用程序中所有的 Bean,并将它们存储在一个 BeanFactory 中。当应用程序需要使用某个 Bean 时,Spring 容器会自动将该 Bean 注入到应用程序中。

再往下理解也可以说,DI 是通过 Java 反射机制实现的。具体来说,当 Spring 容器需要注入某个 Bean 时,它会使用 Java 反射机制来查找符合条件的 Bean,并将其注入到应用程序中。

所以说,@Autowired 注解是通过 DI 的方式,底层通过 Java 的反射机制来实现的。

9. Bean 将一个对象注入多次

  1. 精确的描述 Bean 的名称(将注入的名字写对)。
  2. 使用 @Resource 设置 name 的方式来重命名注入对象。
  3. 如果限定不能单独使用 @AutoWired,那就可以再加上使用 @Qualifier,来删选 Bean 对象。

10. Bean 有几种作用域

  1. singleton: 单例模式 (默认,每次请求取的是同一个对象)
  2. prototype: 原型模式 (多例模式,每次请求创建一个新的对象)
  3. request: 请求作用域 ( 表示在一次 HTTP 请求中只存在一个 Bean 实例。在同一个请求中,多次请求该 Bean 时都会返回同一个实例。不同的请求之间,该 Bean 的实例是相互独立的)
  4. session: 会话作用域 (表示在一个 HTTP Session 中只存在一个 Bean 实例。在同一个 Session 中,多次请求该 Bean 时都会返回同一个实例。不同的 Session 之间,该 Bean 的实例是相互独立的)
  5. application: 全局作用域 (表示在一个 ServletContext 中只存在一个 Bean 实例。该作用域只在 Spring ApplicationContext 上下文中有效)、
  6. websocket: HTTP WebSocket 作用域 (表示在一个 WebSocket 中只存在一个 Bean 实例。该作用域只在 Spring ApplicationContext 上下文中有效。)

使用 @Scope 标签来声明 Bean 的作用域,

11. Bean 的生命周期

  1. 实例化 Bean(给 Bean 对象分配内存空间)
  2. 设置属性(Bean 对象注入)
  3. Bean 初始化
  4. 使用 Bean
  5. 销毁 Bean

这个五个流程可以理解为:买房子-》装修-》买家电-》入住-》卖房

12. Spring 的执行流程

  1. 启动 Spring 容器
  2. 实例化 Bean (分配内存空间)
  3. 将 Bean 注册到 Spring 中 (存操作)
  4. 将 Bean 装配到需要的类中 (取操作)

13. Spring 和 SpringBoot 的区别

Spring 和 Spring Boot 的区别在于它们的目标和用途不同。

Spring 是一个轻量级的开源框架,它提供了一种简单的方式来构建企业级应用程序。

Spring Boot 就是Java脚手架,是 Spring 框架的延伸和扩展,它提供了一种快速构建应用程序的方式。

SpringBoot 框架的特点:

  1. 快速集成框架,SpringBoot 提供了启动添加依赖的功能;
  2. 内置运行容器,无需配置 Tomcat 等 Web 容器, 直接运行和部署程序;
  3. 快速部署项目,无需外部容器即可启动并运行项目;
  4. 可以完全抛弃繁琐的 XML, 使用注解和配置(yml 、properties)的方式进行开发;
  5. 支持更多的监控指标, 可以更好的了解项目的运行情况;

14. Spring MVC 是什么

MVC 是 Model View Controller 的缩写,也就是 模型-视图-控制器,它是一种设计模式。

MVC 是一种思想,而 Spring MVC 就是实现。

Spring MVC 是什么
Spring MVC 是一个 Web 框架
Spring MVC 是基于 Servlet API 构建的

15. Spring MVC中常使用的注解都有哪些

  1. @RequestMapping:路由映射,而且也可以指定一些参数比如 method、value,也可以使用其他的路由映射的注解:@PostMappring、@GetMapping

  2. @ResponseBody 返回一个非静态页面的数据

  3. @RestController = @ResponseBody + @Controller

  4. 后端参数重命名 @RequestParam(有些特殊情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,这样就可以在方法传参中使用 @RequestParam 进行参数重命名)

  5. 接收 JSON 格式的数据 @RequestBody(方法传参传过来的是JSON格式,这就可以使用注解 @RequestBody 进行接收)

  6.  从 URL 地址中获取参数 @PathVariable

  7. @Slf4j 日志

  8. @Data

.......

16. MyBatis 是什么

简单来说 MyBatis 框架简化了重复写 JDBC 的过程,可以更加方便的去操作数据库;

  1. MyBatis 是一款优秀的持久层框架
  2. MyBatis 也是一个 ORM (Object Relational Mapping)框架,即对象关系映射
  3. 它支持自定义 SQL、存储过程以及高级映射
  4. MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
  5. MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录

一般 ORM 框架会将数据库模型的每张表都映射为一个 Java 类,也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换

  1. 数据库表 ——》 映射为 类
  2. 记录(行数据) ——》映射为 对象
  3. 字段 ——》 映射为 对象的数据

17. Mybatis 的交互流程

  1. 前端通过 ajax 将请求发送到后端 controller 控制器这一层;
  2. controller 控制器这一层主要的工作就是验证参数的合法性,参数校验完成后,将数据发送给 service 服务器这一层;
  3. service 这一层主要是负责业务逻辑处理,管理接口,处理完成后将数据发送给 mapper 层;
  4. mapper 持久层 主要的工作就是负责和数据库交互,执行CRUD的操作,这里主要有两个 InterFace 进行声明,XML 进行实现,然后通过 @Mapper 注解将 Interface 和 xml 进行关联,从而执行sql语句;
  5. sql 语句执行完成后,将结果返回给 service 服务层,服务层再将结果返回给控制器,最终控制层将结果进行处理后返回给前端。

18. #{} 和 ${} 的区别

  1. 定义不同:#{} 预处理;而 ${} 是直接替换;
  2. 使用不同:#{} 适用于所有类型的参数匹配;但 ${} 只适用于数值类型(如果传的是字符串类型,$直接替换就会导致字符串没有带双引号);
  3. 安全性不同:#{} 性能高,并且没有安全性问题;但 ${} 存在 SQL 注入的安全问题;

19. 动态 SQL 是什么

动态 SQL 是指可以根据不同的参数信息来动态拼接的不确定的 SQL 叫做动态 SQL,动态 SQL 是 MyBatis 的强大特性之一

所以像这种情况就可以使用动态 sql中的if 去判断,这个字段是否为null,如果不为null就拼接到 sql 上,比传统sql语句更加的方便;

其他的动态 sql 标签还有

  1. if :判断当前字段是否为 null,如果不为 null 就拼接到 sql 上;
  2. trim:去除 SQL 语句前面或后面多余的某个字符
  3. where :实现查询中的 where 替换
  4. set :进行修改操作时,配合 if 来处理非必传参数的,它的特点是会自动去除最后一个英文逗号
  5. foreach:对集合进行循环;

20. 查询操作时,如果数据库中的字段和对象的属性名不一致时,如果解决

如果数据库字段名称和程序中属性名相同时,可以使用默认的 resultType。

如果不一致的话,需要使用 resultMap,进行返回字典映射;

这里需要区别主键映射和普通映射的写法是不同的;

21. Spring AOP 是什么

AOP 是一种面向切面编程的思想,通过引入横切关注点,将其与核心业务逻辑分离,并以模块化的方式管理,通俗的说就是,AOP 是对某一类事情的集中处理。

比如以前每个页面都需要去判断用户登录的情况,而现在使用AOP后,只需要在某一处进行判断处理,那么其他页面就不需要单独重复去写用户登录校验的情况了。

所以AOP的优点就是将关注点横切从应用程序的核心业务中分离出来,更好的实现模块化和复用。

所以基于这种特点,AOP可以将通用的功能比如日志记录、登录校验、数据返回等等封转成切面,然后在需要的地方进行重用,从而提高代码的可维护性和可重用性

22. Spring AOP 的实现原理

http://t.csdnimg.cn/bjEEk

23. Spring AOP 的应用有哪些,拦截器如何实现

http://t.csdnimg.cn/QJnlv

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/277789.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python电梯楼层数字识别

程序示例精选 Python电梯楼层数字识别 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《Python电梯楼层数字识别》编写代码,代码整洁,规则,易读。 学习与应…

Windows→Linux,本地同步到服务器

适用背景&#xff1a; 用自己电脑修改代码&#xff0c;使用实验室/公司的服务器炼丹的朋友 优势&#xff1a; 本地 <--> 服务器&#xff0c;实时同步&#xff0c;省去文件传输的步骤 本地改 -> 自动同步到服务器 -> 服务器跑代码 -> 一键同步回本地&#xff…

【Redis】聊聊Redis常见数据类型底层结构

对于Redis来说&#xff0c;其实我们操作的数据类型就是String,List、Set、Zset、Hash&#xff0c;但是具体低层使用什么编码进行存储&#xff0c;在面试中是一个高频面试题&#xff0c;所以今天大概整理下对应的。 RedisObject与DictEntry 其实对于key来说一般都是String类型…

基础知识学习 -- qnx 系统

QNX是一个基于优先级抢占的系统。 这也导致其基本调度算法相对比较简单。因为不需要像别的通用操作系统考虑一些复杂的“公平性”&#xff0c;只需要保证“优先级最高的线程最优先得到 CPU”就可以了。 基本调度算法 调度算法&#xff0c;是基于优先级的。QNX的线程优先级&a…

Java学习笔记(15)

JDK7前时间相关类 Date时间类 Simpledateformat Format 格式化 Parse 解析 默认格式 指定格式 EE&#xff1a;表示周几 Parse&#xff1a;把字符串时间转成date对象 注意&#xff1a;创建对象的格式要和字符串的格式一样 Calendar日历类 不能创建对象 Getinstance 获取当…

PHP 生成图片

1.先确认是否有GD库 echo phpinfo(); // 创建一个真彩色图像 $image imagecreatetruecolor(120, 50);// 分配颜色 $bgColor imagecolorallocate($image, 255, 255, 255); // 白色背景 $textColor imagecolorallocate($image, 230, 230, 230); // 黑色文字// 填充背景 image…

代码算法训练营day10 | 232.用栈实现队列、225. 用队列实现栈

day10: 232.用栈实现队列225. 用队列实现栈 232.用栈实现队列 题目链接 状态&#xff1a; 文档&#xff1a;programmercarl.com 思路&#xff1a; 用栈实现队列。要先明白两者的区别。 栈&#xff1a;单开门&#xff0c;先进后出&#xff0c;只有一端能进出。 队列&#xff1a;…

论文解读之Attention-based Deep Multiple Instance Learning

前言 多实例学习是由监督学习演变而来的&#xff0c;我们都知道&#xff0c;监督学习在训练的时候是一个实例&#xff08;或者说一个样本、一条训练数据&#xff09;对应一个确定的标签。而多实例的特点就是&#xff0c;我们在训练的时候的输入是多个实例对应一个确定的标签&a…

国外visa卡怎么办理,可充ChatGPTPLUS、Claude、Midjourney

很多小伙都在使用ChatGPT&#xff0c;但是想充值ChatGPTPLUS缺需要国外的visa卡&#xff0c;拿自己的银联卡&#xff0c;尝试了好多次还是不行&#xff0c;其实用一张国外的visa卡几分钟就可以升级好 办理国外visa卡&#xff0c;点击获取 国外的visa卡&#xff0c;具体要看你…

HarmonyOS-鸿蒙系统概述

你了解鸿蒙系统吗&#xff1f; 你看好鸿蒙系统吗&#xff1f; 今年秋季即将推出的HarmonyOS Next 星河版热度空前&#xff0c;一起来了解一下吧。本文将从HarmonyOS 的应用场景、发展历程、架构、开发语言、开发工具、生态建设六个角度聊一聊个人的理解。 1、应用场景 鸿蒙…

Go——运算符,变量和常量,基本类型

一.运算符 Go语言内置的运算符有&#xff1a; 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 1.1 算术运算符 注意&#xff1a;(自增)和--(自减)在go语言中是单独的语句&#xff0c;并不是运算符。 1.2 关系运算符 1.3 逻辑运算符 1.4 位运算符 位运算符对整数在内存…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

TCP/UDP协议

TCP/UDP协议都工作在传输层 这两个协议的目标都是在程序之间传输数据&#xff08;可以是文本文件、图片、视频&#xff09;&#xff0c;对于TCP协议和UDP协议来说&#xff0c;都是一堆二进制数。 把人与人之间的通信看成是进程间通信&#xff0c;“写信”是基于非连接的UDP&a…

Leetcode刷题笔记——动态规划(背包问题)篇

Leetcode刷题笔记——动态规划&#xff08;背包问题&#xff09;篇 一、0-1 背包问题 0-1背包问题简介 有 n 件物品和一个最多能背重量为 w 的背包。第 i 件物品的重量是 weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包…

Unload-labs

function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传的文件类型var allow_ext ".jpg|.png|.gif";//提取上传文件的类…

代码算法训练营day9 | 28. 实现 strStr() 、459.重复的子字符串

day9&#xff1a; 28. 实现 strStr()KMP的主要应用&#xff1a;什么是前缀表&#xff1a;前缀表是如何记录的&#xff1a; 如何计算前缀表&#xff1a;构造next数组&#xff1a;1、初始化2、处理前后缀不相同的情况3、处理前后缀相同的情况 代码&#xff1a; 459.重复的子字符串…

Mysql 索引、锁与MVCC等相关知识点

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 索引类型存储方式区分逻辑区分实际使用区分索引失效情况 索引建立规范SQL编写规范exlpain字段解析ACID的原理日志引擎慢SQL整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a…

德人合科技 | 公司办公终端、电脑文件资料 \ 数据透明加密防泄密管理软件系统

天锐绿盾是一款全面的企业级数据安全解决方案&#xff0c;它专注于为企业办公终端、电脑文件资料提供数据透明加密防泄密管理。 首页 德人合科技——www.drhchina.com 这款软件系统的主要功能特点包括&#xff1a; 1. **透明加密技术**&#xff1a; 天锐绿盾采用了透明加密技…

HarmonyOS NEXT应用开发—Grid和List内拖拽交换子组件位置

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

ChromeDriver 122 版本为例 国内下载地址及安装教程

ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊&#xff0c;不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…