• 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

  • 相关阅读:
    [SpringCloud] OpenFeign核心架构原理 (一)
    【FPGA教程案例40】通信案例10——基于FPGA的简易OFDM系统verilog实现
    猿创征文|创作工具一览
    云原生时代的应用端到端可观测体系如何构建?
    猿创征文|【Python数据科学快速入门系列 | 05】常用科学计算函数
    使用IntelliJ IDEA查看接口的全部实现方法
    解题-->在线OJ(十三)
    c++ 模版元编程-SFINAE(Substitution Failure Is Not An Error)技术
    quartz学习笔记
    重学Kotlin(五) 泛型 类型别名 委托
  • 原文地址:https://blog.csdn.net/m0_58761900/article/details/136757643