文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

面试八股文之Spring

2024-12-02 18:01

关注

「《面试八股文》之 Spring 18卷」 又新鲜出炉了,这次整理了一下关于 spring 的面试题,网上也翻了翻关于 spring 的面试题,汇总了一下,基本都在这里了,当然可能有些过于基本的概念我是直接整理到某一问当中了,就没有单独再开设一问,祝大家面试顺利~

一.spring 中都用到了哪些设计模式?

「1.工厂设计模式」: 比如通过 BeanFactory 和 ApplicationContext 来生产 Bean 对象

「2.代理设计模式」: AOP 的实现方式就是通过代理来实现,Spring主要是使用 JDK 动态代理和 CGLIB 代理

「3.单例设计模式」: Spring 中的 Bean 默认都是单例的

「4.模板方法模式」: Spring 中 jdbcTemplate 等以 Template 结尾的对数据库操作的类,都会使用到模板方法设计模式,一些通用的功能

「5.包装器设计模式」: 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源

「6.观察者模式」: Spring 事件驱动模型观察者模式的

「7.适配器模式」:Spring AOP 的增强或通知(Advice)使用到了适配器模式

二.spring 中有哪些核心模块?

「Spring Core」:Spring核心,它是框架最基础的部分,提供IOC和依赖注入DI特性

「Spring Context」:Spring上下文容器,它是 BeanFactory 功能加强的一个子接口

「Spring Web」:它提供Web应用开发的支持

「Spring MVC」:它针对Web应用中MVC思想的实现

「Spring DAO」:提供对JDBC抽象层,简化了JDBC编码,同时,编码更具有健壮性

「Spring ORM」:它支持用于流行的ORM框架的整合,比如:Spring + Hibernate、Spring + iBatis、Spring + JDO的整合等

「Spring AOP」:即面向切面编程,它提供了与AOP联盟兼容的编程实现

三.说一下你理解的 IOC 是什么?

首先 IOC 是一个「容器」,是用来装载对象的,它的核心思想就是「控制反转」

那么究竟「什么是控制反转」?

控制反转就是说,「把对象的控制权交给了 spring,由 spring 容器进行管理」,我们不进行任何操作

那么为「什么需要控制反转」?

我们想象一下,没有控制反转的时候,我们需要「自己去创建对象,配置对象」,还要「人工去处理对象与对象之间的各种复杂的依赖关系」,当一个工程的量起来之后,这种关系的维护是非常令人头痛的,所以就有了控制反转这个概念,将对象的创建、配置等一系列操作交给 spring 去管理,我们在使用的时候只要去取就好了

四.spring 中的 IOC 容器有哪些?有什么区别?

spring 主要提供了「两种 IOC 容器」,一种是 「BeanFactory」,还有一种是 「ApplicationContext」

它们的区别就在于,BeanFactory 「只提供了最基本的实例化对象和拿对象的功能」,而 ApplicationContext 是继承了 BeanFactory 所派生出来的产物,是其子类,它的作用更加的强大,比如支持注解注入、国际化等功能

五.那 BeanFactory 和 FactoryBean 又有什么区别?

这两个是「不同的产物」

「BeanFactory 是 IOC 容器」,是用来承载对象的

「FactoryBean 是一个接口」,为 Bean 提供了更加灵活的方式,通过代理一个Bean对象,对方法前后做一些操作。

六.@Repository、@Service、@Compent、@Controller它们有什么区别?

这四个注解的「本质都是一样的,都是将被该注解标识的对象放入 spring 容器当中,只是为了在使用上区分不同的应用分层」

七.那么 DI 又是什么?

DI 就是依赖注入,其实和 IOC 大致相同,只不过是「同一个概念使用了不同的角度去阐述」

DI 所描述的「重点是在于依赖」,我们说了 「IOC 的核心功能就是在于在程序运行时动态的向某个对象提供其他的依赖对象」,而这个功能就是依靠 DI 去完成的,比如我们需要注入一个对象 A,而这个对象 A 依赖一个对象 B,那么我们就需要把这个对象 B 注入到对象 A 中,这就是依赖注入

spring 中有三种注入方式

八.说说 AOP 是什么?

AOP 意为:「面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术」。

AOP 是 「OOP(面向对象编程) 的延续」,是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

「AOP 实现主要分为两类:」

spring 中 AOP 的实现是「通过动态代理实现的」,如果是实现了接口就会使用 JDK 动态代理,否则就使用 CGLIB 代理。

「有 5 种通知类型:」

九.动态代理和静态代理有什么区别?

「静态代理」

「动态代理」

十.JDK 动态代理和 CGLIB 代理有什么区别?

JDK 动态代理时业务类「必须要实现某个接口」,它是「基于反射的机制实现的」,生成一个实现同样接口的一个代理类,然后通过重写方法的方式,实现对代码的增强。

CGLIB 动态代理是使用字节码处理框架 ASM,其原理是通过字节码技术为一个类「创建子类,然后重写父类的方法」,实现对代码的增强。

十一.Spring AOP 和 AspectJ AOP 有什么区别?

Spring AOP 是运行时增强,是通过「动态代理实现」的

AspectJ AOP 是编译时增强,需要特殊的编译器才可以完成,是通过「修改代码来实现」的,支持「三种织入方式」

 

十二.spring 中 Bean 的生命周期是怎样的?

SpringBean 生命周期大致分为4个阶段:

「实例化」,实例化该 Bean 对象

「填充属性」,给该 Bean 赋值

「初始化」

「销毁」

如果实现了 DisposableBean 接口,则会回调该接口的 destroy 方法

如果配置了 destroy-method 方法,则会执行 destroy-method 配置的方法

十三.spring 是怎么解决循环依赖的?

循环依赖就是说两个对象相互依赖,形成了一个环形的调用链路

spring 使用三级缓存去解决循环依赖的,其「核心逻辑就是把实例化和初始化的步骤分开,然后放入缓存中」,供另一个对象调用

当 A、B 两个类发生循环引用时 大致流程

A 完成实例化后,去「创建一个对象工厂,并放入三级缓存」当中

如果 A 被 AOP 代理,那么通过这个工厂获取到的就是 A 代理后的对象

如果 A 没有被 AOP 代理,那么这个工厂获取到的就是 A 实例化的对象

A 进行属性注入时,去「创建 B」

B 进行属性注入,需要 A ,则「从三级缓存中去取 A 工厂代理对象」并注入,然后删除三级缓存中的 A 工厂,将 A 对象放入二级缓存

B 完成后续属性注入,直到初始化结束,将 B 放入一级缓存

「A 从一级缓存中取到 B 并且注入 B」, 直到完成后续操作,将 A 从二级缓存删除并且放入一级缓存,循环依赖结束

spring 解决循环依赖有两个前提条件:

「不全是构造器方式」的循环依赖(否则无法分离初始化和实例化的操作)

「必须是单例」(否则无法保证是同一对象)

十四.为什么要使用三级缓存,二级缓存不能解决吗?

可以,三级缓存的功能是只有真正发生循环依赖的时候,才去提前生成代理对象,否则只会「创建一个工厂并将其放入到三级缓存」中,但是不会去通过这个工厂去真正创建对象。

如果使用二级缓存解决循环依赖,意味着所有 Bean 在实例化后就要完成 AOP 代理,这样「违背了 Spring 设计的原则」,Spring 在设计之初就是在 Bean 生命周期的最后一步来完成 AOP 代理,而不是在实例化后就立马进行 AOP 代理。

十五.@Autowired 和 @Resource 有什么区别?

十六.spring 事务隔离级别有哪些?

十七.spring 事务的传播机制有哪些?

「propagation_required」

「propagation_supports」

「propagation_mandatory」

「propagation_nested」

「propagation_never」

「propagation_requires_new」

「propagation_not_supported」

十八.springBoot 自动装配原理?

容器在启动的时候会调用 EnableAutoConfigurationImportSelector.class 的 selectImports方法「获取一个全面的常用 BeanConfiguration 列表」

之后会读取 spring-boot-autoconfigure.jar 下面的spring.factories,「获取到所有的 Spring 相关的 Bean 的全限定名 ClassName」

之后继续「调用 filter 来一一筛选」,过滤掉一些我们不需要不符合条件的 Bean

最后把符合条件的 BeanConfiguration 注入默认的 EnableConfigurationPropertie 类里面的属性值,并且「注入到 IOC 环境当中」

 

来源:moon聊技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯