Spring在面试中的高频考点

Spring

Spring框架是大家学习后续其他框架的基础吧,建议大家好好学习,有时间和精力的可以结合视频去看看源码,对自己的提升还是很不错的。在阅读源码的过程中可以自己画一些流程图之类的,加深自己的理解。下图就是我当时在看源码视频跟着画的图,画完后感觉印象很深,在面试的是就可以跟面试官说你看过Spring某一块的源码,这绝对是一个加分项!

图片说明

1 Spring框架了解吗?说说它的优缺点

回答:Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。

一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。比如:Core Container 中的 Core 组件是Spring 所有组件的核心,Beans 组件和 Context 组件是实现IOC和依赖注入的基础,AOP组件用来实现面向切面编程。

Spring 官网列出的 Spring 的 6 个特征:

  • 核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。
  • 测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。
  • 数据访问 :事务,DAO支持,JDBC,ORM,编组XML。
  • Web支持 : Spring MVC和Spring WebFlux Web框架。
  • 集成 :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。
  • 语言 :Kotlin,Groovy,动态语言。

Spring框架的好处?

  • 轻量级:Spring框架是轻量级的,最基础的版本大约只有2MB。
  • 控制反转(IOC):通过控制反转技术,实现了解耦合。对象给出它们的依赖,而不是创建或查找依赖的对象。
  • 面向切面(AOP):Spring支持面向切面的编程,并将应用程序业务逻辑与系统服务分离。
  • MVC框架:Spring的WEB框架是一个设计良好的web MVC框架,它为web框架提供了一个很棒的替代方案。
  • 容器:Spring包含并管理对象的生命周期和配置。
  • 事务管理:Spring提供了一个一致性的事务管理接口,可以收缩到本地事务,也可以扩展到全局事务(JTA)。
  • 异常处理:Spring提供了方便的API来将具体技术的异常(由JDBC、Hibernate或JDO抛出)转换为一致的unchecked 异常。

Spring框架的缺点?

Spring 能够给我们带来很多方便之处,但是同样也存在很多的问题:

使用了大量的反射机制,反射机制非常占用内存。

(一)重量级框架
我们看到 Spring 架构图时会发现 Spring 里面包含有很多其他组件,比如数据访问、MVC、事务管理、面向切点、WebSocket 功能等,因此这么复杂的组件集中到一起就会提高初学者的学习成本。还有一方面随着你的服务越多,那么 Spring 的启动就会变得越慢。

(二)集成复杂
比如我们想要使用 MyBatis 或者 MongoDB的时候,我们要做很多工作不管使用配置方式也好还是使用注解方式。

(三)配置复杂
在使用 Spring 的时候,我们更多可能是选择 XML 进行配置,但目前这种配置方式已不在流行。

(四)构建和部署复杂
启动 Spring 的 IOC 容器,是完全要依赖于第三方的 web 服务器。自身不能启动的。

2、Spring中有两个重要特性是什么?

回答:Spring中有两个非常重要的特性IOC和AOP,其中AOP是对IOC功能的拓展,

IOC:IOC是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。负责创建对象,使用依赖注入(dependency injection,DI)管理它们,将对象集中起来,配置对象,管理对象的整个生命周期。

AOP:AOP模块用于为支持Spring应用程序面向切面的开发。AOP联盟提供了很多支持,这样就确保了Spring和其他AOP框架的共通性。面向切面编程能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度,并有利于未来的可拓展性和可维护性

追问:IOC的好处有哪些?

  • IOC或依赖注入最小化应用程序代码量。
  • 它使测试应用程序变得容易,因为单元测试中不需要单例或JNDI查找机制。
  • 以最小的代价和最少的干扰来促进松耦合。
  • IOC容器支持快速实例化和懒加载。

追问:AOP是怎么实现的?

回答:AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理

追问:JDK代理和Cglib代理的区别?

回答:

1、CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高(1.6和1.7的时候,CGLib更快;1.8的时候,jdk更快)

2、CGLib在创建对象的时候所花费的时间却比JDK动态代理多

3、singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反之,则适合用JDK动态代理

4、JDK生成的代理类类型是Proxy(因为继承的是Proxy),CGLIB生成的代理类类型是Enhancer类型

5、JDK动态代理是面向接口的,CGLib动态代理是通过字节码底层继承代理类来实现(如果被代理类被final关键字所修饰,那么会失败)

6、如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);
如果要被代理的对象不是实现类,那么Spring会强制使用CGLib来实现动态代理。 

3、Spring中bean有哪些作用域?

  • singleton:Spring将bean定义的范围限定为每个Spring IOC容器只有一个单实例。
  • prototype:单个bean定义有任意数量的对象实例。
  • request:作用域为一次http请求,该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • session:作用域为HTTP Session,该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • global-session:作用域为全局的HTTP session。该作用域也是仅在基于web的Spring ApplicationContext情形下有效。

默认的作用域是singleton。

追问:单例模式是线程安全的吗?

(这个问题阿里二面的时候被问到过)

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。(这个大家可以自行去网上搜一下,顺便学习一下。)

4、Spring中有哪些常见的注解?

回答:这个问题可以选择几个常见的说一下就行,下面给大家列出比较全面的,主要说几个自己项目里用到的即可。

  • @Component:用于指示类是组件。这些类用于自动注入,并在使用基于注解的配置时配置为bean。

  • @Controller:是一种特定类型的组件,用于MVC应用程序,主要与@RequestMapping注解一起使用。

  • @Repository:用于表示组件用作存储库和存储/检索/搜索数据的操作。我们可以将此注解应用于DAO实现类。

  • @Service:用于指示类是服务层。

  • @Required:此注解简单地说明作用的bean属性必须在配置时通过bean定义中的显式属性值或通过自动注入填充。如果作用的bean属性未填充,容器将抛出BeanInitializationException。

  • @ResponseBody:用于将对象作为response,通常用于将XML或JSON数据作为response发送。

  • @PathVariable:用于将动态值从URI映射到处理方法参数。

  • @Autowired:对自动注入的位置和方式提供了更细粒度的控制。它可以用于在setter方法上自动注入bean。就像@Required 注解一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。

  • @Qualifier:当有多个相同类型的bean并且只需要将一个bean自动注入时,@Qualifier注解与@Autowired注释一起使用,通过指定将连接哪个bean来消除歧义。

  • @Scope:配置Spring bean的作用域。

  • @Configuration:表示Spring IOC容器可以将该类用作bean定义的源。

  • @ComponentScan:应用此注解时,将扫描包下的所有可用类。

  • @Bean:对于基于java的配置,用@Bean注解修饰的方法将返回一个在Spring应用程序上下文中注册为Bean的对象。

  • 用于配置切面和通知、@Aspect、@Before、@After、@Around、@Pointcut等的AspectJ注解。

5、XML配置和注解之间有什么区别?

注解的优点:

  • 所有信息都在一个文件中
  • 当类更改了,不用修改xml配置文件

xml配置的优点:

  • POJO及其行为之间更清晰地分离
  • 当你不知道哪个POJO负责该行为时,更容易找到该POJO

6、 Spring支持的事务管理类型?

回答:

  • 编程式事务,在代码中硬编码。(不推荐使用)
  • 声明式事务,在配置文件中配置(推荐使用)

声明式事务又分为两种:

  1. 基于XML的声明式事务
  2. 基于注解的声明式事务

追问:Spring 事务中的隔离级别有哪几种?

TransactionDefinition 接口中定义了五个表示隔离级别的常量:

  • TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
  • TransactionDefinition.ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

推荐阅读

#高频知识点汇总##Java##学习路径#
全部评论
前排~😍
1 回复
分享
发布于 2021-12-03 10:14
优秀
点赞 回复
分享
发布于 2021-12-03 11:02
英特尔
校招火热招聘中
官网直投
🎉恭喜牛友成功参与 【创作激励计划】高频知识点汇总专场,并通过审核! ------------------- 创作激励计划5大主题专场等你来写,最高可领取500元京东卡和500元实物奖品! 👉快来参加吧:https://www.nowcoder.com/discuss/804743
点赞 回复
分享
发布于 2021-12-03 11:11
需要更多资料和资源可以关注公众号:代码界的小白
点赞 回复
分享
发布于 2021-12-15 21:04
优秀,能转载码
点赞 回复
分享
发布于 2021-12-21 18:49
收藏了
点赞 回复
分享
发布于 2022-02-28 17:02
理想汽车内部专属内推 https://app.mokahr.com/m/campus_apply/chehejia/40949?recommendCode=DSSCgruY#/jobs
点赞 回复
分享
发布于 2022-02-28 17:06
理想汽车春季招聘,车企顶级待遇,内部专属内推链接(内推码已自动填好),可私信加vx好友全程跟进: https://app.mokahr.com/m/campus_apply/chehejia/40949?recommendCode=DSSCgruY#/jobs
点赞 回复
分享
发布于 2022-02-28 22:49
阿里钉钉业务平台内推~康康https://www.nowcoder.com/discuss/848091
点赞 回复
分享
发布于 2022-03-01 10:30

相关推荐

45 376 评论
分享
牛客网
牛客企业服务