【面试专题】Spring篇①

📃个人主页:个人主页

🔥系列专栏:Java面试专题

 

目录

 

1.你知道 Spring 框架中有哪些重要的模块吗?

2. 谈谈你对 IOC 的认识。

3. 谈谈你对 AOP 的认识。

4.在实际写代码时,有没有用到过 AOP?用过的话是在什么地方或者什么场景下?

5.Spring中的事务是如何实现的

6.Transaction 在哪些情况下可能会失效?

7.说说你对 Spring 中的 Bean 的理解。

8. 有哪些方法往 Spring 容器中添加 Bean。

9.Spring框架中的单例bean是线程安全的吗?

10.Spring的bean的生命周期


1.你知道 Spring 框架中有哪些重要的模块吗?

(1)核心层
Core Container:核心容器,这个模块是Spring最核心的模块,其他的都需要依赖该模块。


(2)AOP层
AOP:面向切面编程,它依赖核心层容器,目的是在不改变原有代码的前提下对其进行功能增强
Aspects:AOP是思想,Aspects是对AOP思想的具体实现


(3)数据层
Data Access:数据访问,Spring全家桶中有对数据访问的具体实现技术
Data Integration:数据集成,Spring支持整合其他的数据层解决方案,比如Mybatis
Transactions:事务,Spring中事务管理是Spring AOP的一个具体实现


(4)Web层
提供创建 Web 应用程序的能力


(5)Test层
Spring主要整合了Junit来完成单元测试和集成测试
 

2. 谈谈你对 IOC 的认识。

IoC(Inversion of Control)是控制反转的意思,这是一种面向对象编程的设计思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高,在一个大型的项目中这十分的不利于代码的维护。IoC则可以解决这种问题,它可以帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。

说到IoC就不得不说DI(Dependency Injection),DI是依赖注入的意思,它是IoC实现的实现方式,就是说IoC是通过DI来实现的。由于IoC这个词汇比较抽象而DI却更直观,所以很多时候我们就用DI来代替它,在很多时候我们简单地将IoC和DI划等号,这是一种习惯。而实现依赖注入的关键是IoC容器,它的本质就是一个工厂。

在具体的实现中,主要由三种注入方式:

  1. 构造方法注入

    就是被注入对象可以在它的构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象。然后,IoC Service Provider会检查被注入的对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。构造方法注入方式比较直观,对象被构造完成后,即进入就绪状态,可以马上使用。

  2. setter方法注入

    通过setter方法,可以更改相应的对象属性。所以,当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。setter方法注入虽不像构造方法注入那样,让对象构造完成后即可使用,但相对来说更宽松一些, 可以在对象构造完成后再注入。

  3. 接口注入

    相对于前两种注入方式来说,接口注入没有那么简单明了。被注入对象如果想要IoC Service Provider为其注入依赖对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。相对于前两种依赖注入方式,接口注入比较死板和烦琐。

总体来说,构造方法注入和setter方法注入因为其侵入性较弱,且易于理解和使用,所以是现在使用最多的注入方式。而接口注入因为侵入性较强,近年来已经不流行了。

🍉扩展阅读🍉

如何使用 IOC

在 Spring5 之后,注解代替配置文件成了编程的主流趋势,下面展示如何使用注解实现 IOC。

首先创建一个配置文件类 MainConfig,这个类使用 @Configuration 修饰,声明它是个配置类:

import org.springframework.context.annotation.Configuration;

@Configuration
public class MainConfig {
}

创建具体的 Student 类:

public class Student {
    private String name;
    private int age;
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
}

在未使用 IOC 之前,创建对象实例的方式是通过 new()。比如创建 Student 类时通过 Student student = new Student() 这行代码。而使用 IOC 的话需要把 Student 这个类交给 Spring 容器。在 MainConfig 类中增加以下代码:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MainConfig {
    @Bean
    public Student student(){
        return new Student();
    }
}

被 Spring 容器管理的 Bean 可以通过 @Autowired 注解和 annotationConfigApplicationContext.getBean("student",Student.class); 的方式获取到 Bean 对象。

3. 谈谈你对 AOP 的认识。

AOP(Aspect-Oriented Programming:面向切面编程)翻译为面向切面编程,能够将那些与业务无关的逻辑封装起来,从而减少系统的重复代码,降低模块之间的耦合度,同时也具备着更强的可扩展能力。

AOP的术语

  • 连接点(join point):对应的是具体被拦截的对象,因为Spring只能支持方法,所以被拦截的对象往往就是指特定的方法,AOP将通过动态代理技术把它织入对应的流程中。

  • 切点(point cut):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点。切点就是提供这样一个功能的概念。

  • 通知(advice):就是按照约定的流程下的方法,分为前置通知、后置通知、环绕通知、事后返回通知和异常通知,它会根据约定织入流程中。

  • 目标对象(target):即被代理对象。

  • 引入(introduction):是指引入新的类和其方法,增强现有Bean的功能。

  • 织入(weaving):它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。

  • 切面(aspect):是一个可以定义切点、各类通知和引入的内容,SpringAOP将通过它的信息来增强Bean的功能或者将对应的方法织入流程。

Spring AOP

AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式。

  • JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。

  • CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。

4.在实际写代码时,有没有用到过 AOP?用过的话是在什么地方或者什么场景下?

记录操作日志,缓存,spring实现的事务

我曾经写过一个自定义日志的功能是通过 AOP 实现,核心是:使用aop中的环绕通知+切点表达式(找到要记录日志的方法)通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取到这些参数以后,保存到数据库。

5.Spring中的事务是如何实现的

Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。

编程式事务管理需要在代码中显式地声明事务的开始和结束,并手动处理事务的提交或回滚。这种方式比较灵活,但也比较繁琐。

声明式事务管理则是通过配置来实现事务管理,不需要在代码中显式地声明事务的开始和结束。声明式事务管理可以使用XML或注解方式进行配置。XML方式需要在Spring的配置文件中定义事务管理器和事务切面,而注解方式则使用@Transactional注解来标记需要进行事务管理的方法。

6.Transaction 在哪些情况下可能会失效?

①当用 Transactional 修饰非 public 方法时,Transactional 注解是不会生效的。

因为底层cglib是基于父子类来实现的,子类是不能重载父类的private方法的,所以无法很好的利用代理

②如果在一个类的内部调用了事务方法,Transactional 也不会生效。

开发中避免不了会对同一个类里面的方法调用,比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。

这是由于使用Spring AOP代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理。
 

③默认情况下只会在捕获了 RuntimeException 后 Transactional 注解才会生效,如果在代码中捕获了异常后未抛出,则 Transactional 失效。

7.说说你对 Spring 中的 Bean 的理解。

Spring 中的 Bean 简单来讲就是一个个被 Spring 容器管理的 Java 对象,我们写了一个类之后,这个类只是一个单纯的 Java 类,可以通过 new() 的方式去创建它。当我们把这个类添加到 Spring 的容器里之后,这个类就变成了 Bean,由 Spring 容器管理,可以通过自动注入的方式去使用。

8. 有哪些方法往 Spring 容器中添加 Bean。

常用的添加 Bean 的方式主要有以下几种方法:

  • @Bean: 写一个普通的类时最常用的添加 Bean 的方式
  • @ComponentScan + @Controller @Service @Component @Repository:@ComponentScan 用来扫描后面的四个注解,被后面四个注解修饰的类如果被 @ComponentScan 扫描到,就会注册到 Spring 容器中。
  • @Import:通过导入的方式注入 Bean。
  • @ImportBeanDefinitionRegister:和 Import 类似,可以指定 Bean 的名称。

9.Spring框架中的单例bean是线程安全的吗?

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

10.Spring的bean的生命周期

①通过BeanDefinition获取bean的定义信息
②调用构造函数实例化bean
③bean的依赖注入
④处理Aware接口(BeanNameAware、 BeanFactoryAware、ApplicationContextAware)

⑤Bean的后置处理器BeanPostProcessor-前置
⑥初始化方法(InitializingBean、init-method)

⑦Bean的后置处理器BeanPostProcessor-后置
⑧销毁bean

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案

为满足当下对数字化文档校对的精准需求,我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试,该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性: 1.全面性校对:工具支持…

wazuh--sql检测

官网:Virtual Machine (OVA) - Installation alternatives Wazuh(Wazuh The Open Source Security Platform):是一整套基于ossec安全检测工具和EFK日志工具构成的终端安全管理工具。不管是将其分类至HIDS,还是EDR,它都是一套通过…

MySQL数据库:内置函数

日期函数 规定:日期:年月日 时间:时分秒 函数名称作用描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date,interval d_value_type)在date中添加…

Kotlin 高阶函数详解

高阶函数 在 Kotlin 中,函数是一等公民,高阶函数是 Kotlin 的一大难点,如果高阶函数不懂的话,那么要学习 Kotlin 中的协程、阅读 Kotlin 的源码是非常难的,因为源码中有太多高阶函数了。 高阶函数的定义 高阶函数的…

vue中form和table标签过长

form标签过长 效果&#xff1a; 代码&#xff1a; <el-form-item v-for"(item,index) in ticketEditTable1" :label"item.fieldNameCn" :propitem.fieldName :key"item.fieldNameCn" overflow"":rules"form[item.fieldName…

Python土力学与基础工程计算.PDF-土的三项组成

5.3 Python求解 Python 求解代码如下&#xff1a; 1. # 定义已知参数 2. G_s 2.7 # 比重 3. w 0.2 # 含水量 4. e 0.6 # 孔隙比 5. gamma_w 9.81 # 水的重度 6. 7. # 根据公式计算饱和度 8. S_r G_s * w / e 9. print("饱和度为", S_r) 10. 11.…

rust库学习-env_logger(actix-web添加彩色日志、rust添加彩色日志 )

文章目录 介绍actix-web启用彩色日志crate地址&json格式日志 我们在进行rust的web开发时&#xff0c;如果不指定日志&#xff0c;就不会有输出&#xff0c;非常不友好 这里我们使用env_logger进行日志打印 介绍 env_logger 需要配合 log 库使用, env_logger 是 Rust 社区…

SpringCloud学习笔记(四)_ZooKeeper注册中心

基于Spring Cloud实现服务的发布与调用。而在18年7月份&#xff0c;Eureka2.0宣布停更了&#xff0c;将不再进行开发&#xff0c;所以对于公司技术选型来说&#xff0c;可能会换用其他方案做注册中心。本章学习便是使用ZooKeeper作为注册中心。 本章使用的zookeeper版本是 3.6…

Android相机-HAL子系统

引言 应用框架要通过拍照预览摄像获得照片或者视频,就需要向相机子系统发出请求, 一个请求对应一组结果 一次可发起多个请求&#xff0c;并且提交请求是非阻塞的&#xff0c;始终按照接收的顺序以队列的形式先进先出地进行顺序处理 一个请求包含了拍摄和拍照配置的所有信息&…

图为科技-边缘计算在智慧医疗领域的作用

边缘计算在智慧医疗领域的作用 随着科技的进步&#xff0c;智慧医疗已成为医疗行业的重要发展趋势。边缘计算作为新兴技术&#xff0c;在智慧医疗领域发挥着越来越重要的作用。本文将介绍边缘计算在智慧医疗领域的应用及其优势&#xff0c;并探讨未来发展方向。 一、边缘计算…

Skywalking Kafka Tracing实现

背景 Skywalking默认场景下&#xff0c;Tracing对于消息队列的发送场景&#xff0c;无法将TraceId传递到下游消费者&#xff0c;但对于微服务场景下&#xff0c;是有大量消息队列的业务场景的&#xff0c;这显然无法满足业务预期。 解决方案 Skywalking的官方社区中&#xf…

远程调试环境配置

目录 一、准备工作 二、ssh连接和xdebug配置 1.ssh连接 2.xdebug配置 三、xdebug调试&#xff0c;访问 一、准备工作 1.安装vscode里面的两个扩展 2.安装对应PHP版本的xdebug 去xdebug官方&#xff0c;复制自己的phpinfo源码到方框里&#xff0c;再点击Analyse Xdebug: …

Pandas数据清洗和常用函数

数据清洗 数据清洗是对一些没用的数据进行处理的过程。 当数据出现确实、数据格式错误、错误数据或重复数据的情况&#xff0c;如果我们想要分析的更加准确&#xff0c;就要对没用的数据进行处理。 此时我们学习采用菜鸟教程的数据作为案例&#xff0c;如下图所示。 在途中包…

AWS SDK 3.x for .NET Framework 4.0 可行性测试

前言 为了应对日益增长的网络安全挑战, 越来越多的互联网厂商已经陆续开始或者已经彻底停止了对 SSL 3 / TLS 1.0 / TLS1.1 等上古加密算法的支持. 而对于一些同样拥有悠久历史的和 AWS 服务相关联的应用程序, 是否可以通过仅更新 SDK 版本的方式来适应新的环境. 本文将以 Win…

【ElasticSearch】一键安装IK分词器无需其他操作

要注意的时下面命令中的es是我容器的名称&#xff0c;要换成你对应的es容器名 docker exec -it es /bin/bash # 进入容器 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis- ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.1…

锚定医学营养 健启星深耕不辍

在生命医学中&#xff0c;营养被称为维持患者生命的物质基础。医学营养&#xff0c;是结合了医学临床营养、营养素与疾病预防等方面&#xff0c;并根据患者的医疗记录、身体检查及心理情况&#xff0c;由医生及专业营养师给出配比完善的营养素&#xff0c;以此来增加患者身体的…

IDEA常用插件之类Jar包搜索Maven Search

文章目录 IDEA常用插件之类Jar包搜索Maven Search说明安装插件使用方法1.搜索自己要搜的jar包2.根据类名搜索 IDEA常用插件之类Jar包搜索Maven Search 说明 它可以帮助用户快速查找和浏览Maven中央存储库中可用的依赖项和插件。它可以帮助用户更方便地管理项目依赖项。 安装…

进行Stable Diffusion的ai训练怎么选择显卡?

Stable Diffusion主要用于从文本生成图像&#xff0c;是人工智能技术在内容创作行业中不断发展的应用。要在本地计算机上运行Stable Diffusion&#xff0c;您需要一个强大的 GPU 来满足其繁重的要求。强大的 GPU 可以让您更快地生成图像&#xff0c;而具有大量 VRAM 的更强大的…

基于YOLOV8模型的课堂场景下人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的课堂场景下人脸目标检测系统可用于日常生活中检测与定位课堂场景下人脸&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检…

uniapp 使用permission获取录音权限

使用前&#xff0c;需要先配置权限 android.permission.RECORD_AUDIO