【java面试题-Spring篇-2024】

##java面试题大全

详细面试题-持续更新中-点击跳转

点赞、收藏、加关注
·
·

Spring面试题

1、什么是 Spring Framework

Spring Framework,即 Spring 框架。Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。它可以集成其他框架。Spring 的核心有两部分:IoC 控制反转
,AOP 面向切面编程

2、列举 Spring 框架的优点

  • 开源免费
  • 方便解耦,简化开发:Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给 Spring 管理
  • AOP 编程的支持:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
  • 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无须手动编程
  • 方便程序的测试: Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序
  • 方便集成各种优秀的框架:Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持
  • 降低JavaEE API的使用难度:Spring 对 JavaEE 开发中非常难用的一些 API (JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低

3、Spring 框架有哪些不同的功能

  • 控制反转和依赖注入:Core Container 功能模块提供
  • 面向切面编程:AOP & Aspects 功能模块提供
  • 提供了对 junit 或 TestNG 测试框架的整合:Testing 功能模块提供
  • 提供了对数据访问/集成的功能:Data Access/Integration 功能模块提供
  • 提供了面向 Web 应用程序的集成功能:Soring MVc 功能模块提供

4、Spring 框架中有多少个模块,它们分别是什么

在这里插入图片描述
详细解释在这篇文章中:Spring 框架所有模块详解

5、什么是 Spring 配置文件

Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。一般我们都会给它起一个默认的名字:applicationContext.xml

6、Spring 应用程序有哪些不同的组件

  • 接口 —— 定义功能
  • Bean 类 —— 它包含属性,setter 和 getter 方法,函数等
  • Bean 配置文件 —— 包含类的信息以及如何配置它们
  • 面向切面编程(AOP) —— 提供面向切面编程的功能
  • 应用程序 —— 它使用接口

7、什么是 Spring IoC 容器

负责创建对象、管理对象(通过依赖注入(DI))、装配对象、配置对象,并且管理这些对象的整个生命周期的容器就是 Spring IoC容器

8、什么是依赖注入(控制反转)

依赖注入(DI)与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。具体含义是:当某个角色(可能是一个 Java 实例,调用者)需要另一个角色(另一个 Java 实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在 Spring 里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入

9、可以通过多少种方式完成依赖注入

1:构造器注入
将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。使用 constructor-arg 标签
优点: 对象初始化完成后便可获得可使用的对象
缺点: 当需要注入的对象很多时,构造器参数列表将会很长;不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦

2:setter方法注入
IoC Service Provider 通过调用成员变量提供的 setter 函数将被依赖对象注入给依赖类。使用 property 标签
优点: 灵活。可以选择性地注入需要的对象
缺点: 依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用

3:接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象
优点: 接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可
缺点: 侵入性太强,不建议使用

拓展:什么是侵入性:
如果类 A 要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性

10、构造函数注入和 setter 注入区别

  1. 在 setter 注入中,可以将依赖项部分注入;构造方法注入不能部分注入,因为调用构造方法时,如果传入部分参数就会报错
  2. setter 注入将覆盖构造方法注入;构造方法注入不能覆盖 setter 注入值
  3. 使用 setter 注入的情况下 Spring 会先调用对象的构造函数;对于构造器注入,Spring 会在调用构造函数前把构造函数需要的依赖对象都实例化好,然后再把这些实例化后的对象作为参数去调用构造函数
  4. 构造函数注入时,如果 A对象 和 B对象 相互依赖:A 依赖于 B,B 也依赖于 A,此时在创建对象的 A 或者 B 时,Spring 会抛出 ObjectCurrentlyInCreationException;可以通过 setter 注入,解决循环依赖的问题

11、Spring 中有多少种 IOC 容器

常用的两种,详情和区别如下

Spring BeanFactory 容器:

  1. 最简单的容器,给 DI 提供了基本的支持
  2. 默认采用延迟初始化策略,容器启动初期速度快,所需资源有限。移动设备中为了节省有限的资源,会被优先选择。即主要用于轻量级应用
  3. 其用 org.springframework.beans.factory.BeanFactory 接口来定义
  4. BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、BeanFactoryPostProcessor 的使用,BeanFactory 需要手动注册
  5. 不支持国际化
  6. 不支持注解

Spring ApplicationContext 容器:

  1. 在 Spring BeanFactory 容器的基础上,添加了更多企业特定的功能,比 BeanFactory 更加优秀
  2. ApplicationContext 所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成,所以容器启动时间较 BeanFactory 会更长
  3. 其用 org.springframework.context.ApplicationContext 接口来定义
  4. BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、BeanFactoryPostProcessor 的使用,ApplicationContext 自动注册
  5. 支持国际化
  6. 支持注解

12、说一下 IoC 的优点

  • 资源集中管理,实现资源的可配置和易管理
  • 降低了使用资源双方的依赖程度,也就是经常说的耦合度,提高了程序的可维护性
  • 使应用的代码量降低
  • 支持加载服务时的即时加载和懒加载

13、Spring IoC 的实现机制

Spring 中的 IoC 的实现原理是工厂模式加反射机制

工厂模式:
调用一个工厂方法根据传入的参数返回一个对象

反射:
反射就是在工厂模式 getBean() 方法中通过反射的方式来创建 Bean。反射会根据 getBean(name) 中传入的 name 找到类全路径然后进行创建Bean对象
在这里插入图片描述

14、什么是 Spring bean

在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是一个由 Spring IoC 容器实例化、组装和管理的对象

15、Spring 框架提供了哪些配置方式

基于 xml 配置:
bean所需的依赖项和服务在 XML 格式的配置文件中指定

<bean id="testbean" class="cn.hyl.SpringDemo.TestBean">
	<property name="name" value="xtl"></property>
</bean>

基于注解配置:
通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身。在类上面使用 @Component 或其子类(@Repository、@Service、@Controller)来定义 bean

@Component
public class Test {
}

基于 Java API 配置
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。@Bean 注解扮演与元素相同的角色。@Configuration 声明一个类时配置类

@Configuration
@ComponentScan("需要扫描的包名")
public class WebConfig {
    @Bean
    public Test test() {
        return new Test();
    }
}

16、Spring支持的五种 Bean Scope?单例的是线程安全的嘛

Singleton:
默认值,表示 Spring 容器只创建唯一一个 bean 的实例。Spring 里面的 bean 是默认是单例的,可以使用 @Scope 注解来指定模式。平常我们使用的都是没有状态的 bean,没有状态就是没办法修改的对象,所以没有线程安全问题,但是如果这个 bean 有可以修改的成员变量,那么就需要注意线程安全的问题,可以使用多例模式或者加锁

Prototype:
代表线程每次调用或请求这个 bean 都会创建一个新的实例。一般情况下,有状态的 bean 使用该 scope

Request:
每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效

Session:
每个 Session 作用域内的请求只创建一个实例

Global Session:
它仅仅在基于 portlet 的 web 应用中才有意义。portlet 规范定义了全局 Session 的概念。如果在 web 中使用 Global Session 作用域来标识 bean,那么 web 会自动当成 Session 类型来使用

17、Spring Bean容器的生命周期是什么样的

根据 BeanDefinition对象创建Bean,该类里面保存了Bean的相关信息
在这里插入图片描述

  1. Spring 容器根据配置中的 bean 定义中实例化 bean
  2. Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置
  3. 如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用 setBeanName()
  4. 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()
  5. 如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法
  6. 如果为 bean 指定了 init 方法( 或 init-method 属性),那么将调用它
  7. 如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法,通常用它来增强类
  8. 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用destory()
  9. 如果为 bean 指定了 destroy 方法( 或 destroy-method 属性),那么将调用它

18、什么是 Spring 的内部 Bean

只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在 < property > 或 < constructor-arg > 中提供了 < bean > 元素的使用。内部 bean 总是匿名的,它们总是作为原型

19、自动装配有哪些方式

no:
默认的方式是不进行自动装配的,通过手工设置 ref 属性来进行装配 bean

byName:
通过 bean 的名称进行自动装配。如果一个 bean 的 property 与另一个 bean 的 name 相同,就进行自动装配

byType:
通过参数的数据类型进行自动装配.

constructor:
利用构造函数进行装配,并且构造函数的参数通过 byType 进行装配

autodetect:
自动探测,如果有构造方法,通过 construct 的方式自动装配,否则使用 byType 的方式自动装配

20、自动装配有哪些局限性

  • 你如要仍然需要使用 < property >设置指明依赖,这意味着要重写自动装配
  • 不能自动装配简单的属性,如原生类型、字符串和类
  • 自动装配总是没有自定义装配精确

21、什么是基于注解的容器配置

不使用 XML 来描述 bean 装配,开发人员通过在相关的类、方法或字段声明上使用注解将配置移动到组件类本身。它可以作为 XML 设置的替代方案。例如:Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现

@Configuration
public class XtlConfig {
	@Bean 
	public XtlBean xtl() {
		return new XtlBean();
	}
}

22、如何在 Spring 中启动注解装配

默认情况下,Spring 容器中未打开注解装配。要使用基于注解装配,必须通过配置 < context:annotation-config /> 元素在 Spring 配置文件中启用它

23、@Component,@Controller,@Repository,@Service 四者有何区别

四个注解实现的基本功能是一样的,作用相当于配置文件的 bean 标签,被注解的类,spring 始化时,就会创建该对象。不同点是区分的业务层不同

  • @Component :它是任何 Spring 管理组件的通用构造型
  • @Controller :用在控制层,这将一个类标记为Spring Web MVC控制器
  • @Service :用在服务层
  • @Repository :用在 DAO 层,这个注解是 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException

24、@Required 注解有什么用

这个注解表示,受影响的 bean 属性必须在配置的时候被填充,通过 bean 定义或通过自动装配一个明确的属性值

25、@Autowired 注解有什么用

在构造函数上使用:
在 Spring 初始化对象实例时,会调用此构造函数,进行对象的实例化。一般是当一个类中有多个构造方法,且要选择某一个构造方法进行 Spring 实例化时,可以在构造方法上加 @Autowired 注解

在类属性上使用:
将此属性进行注入,默认按照类型注入

在其他方法上使用:
当 Spring 容器调用该类的构造方法,实例化完成该类后,会调用 @Autowired 修饰的方法,并将方法的参数进行实例化,但是必须保证该方法的参数对象在 Spring 容器中也存在,否则会报错

26、@Qualifier 注解有什么用

该注解可以使用在类上、属性上、参数上、方法上。当使用在类上的时候,里面填写的 @Qualifier 值就是当前 bean 的唯一标识,在依赖该 bean 的地方使用 @Autowired + @Qualifier 可以使用该 bean 的名称注入或者该 bean 前面指定的唯一标识

27、@RequestMapping 注解有什么用

@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类或者方法。此注释可应用于两个级别:类级别:表示类中的所有响应请求的方法都是以该地址作为父路径;方法级别:对应执行此方法

28、Spring DAO 是什么

Spring 的 DAO 不是新发明一种技术,而是对原来技术的一种封装,定义了一套简单实用的 api 。使得 JDBC,Hibernate 或 JDO 这样的数据访问技术以一种统一的方式工作,这使得用户容易在持久性技术之间切换。它还对各种技术的异常进行了封装,使开发者无需考虑捕获每种技术不同的异常

29、Spring JDBC API 中存在哪些类

  • JdbcTemplate
  • SimpleJdbcTemplate
  • NamedParameterJdbcTemplate
  • SimpleJdbcInsert
  • SimpleJdbcCall

30、使用 Spring 访问 Hibernate 的方法有哪些

  • 使用 Hibernate 模板和回调进行控制反转
  • 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点

31、列举 Spring 支持的事务管理类型,什么情况下事务会失效

类型:

  • 程序化事务管理:在此过程中,在编程的帮助下管理事务,它为您提供大的灵活性,但维护起来非常困难
  • 声明式事务管理:在此,事务管理与业务代码分离,仅使用注解或 xml 的配置来管理事务

失效:

  • 在方法中捕获异常没有抛出去
  • 非事务方法调用事务方法
  • 事务方法内部调用事务方法,被调用者的事务是不会生效,会合并成一个事务
  • @Transactional 标记的方法不是 public
  • 抛出的异常与属性 rollbackFor 指定的异常不匹配,默认 rollbackFor 指定的异常为 RuntimeException
  • 数据库表不支持事务,比如 MySQL 的 MyISAM
  • Spring 的传播行为导致事务失效,比如:PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTED
    • PROPAGATION_REQUIRED --支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择
    • PROPAGATION_SUPPORTS --支持当前事务,如果当前没有事务,就以非事务方式执行
    • PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常

32、Spring 支持哪些 ORM 框架

  • Hibernate
  • iBatis
  • JPA
  • JDO
  • OJB

33、什么是 AOP

面向切面编程,首先,在面向切面编程的思想里,把功能分为核心功能和周边功能

  • 核心功能:比如 登录,增加,删除数据都叫核心业务
  • 周边功能,比如性能统计,日志,事务管理等
  • 周边功能在 Spring 面向编程的思想中,即被定义为切面
  • 在面向切面编程 AOP 的思想里,把核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 “编织” 在一起,这就叫 AOP

34、什么是切面(aspect)

切面由切点(pointcut)和通知(advice)组成,横切逻辑的定义。@Aspect 来标注此类是一个切面类,在切面类里面由切点、通知等代码组成,需要增强的的功能代码等就写在此类里面

35、什么是切点(pointcut)

切点,每个类都拥有多个连接点,是一个连接点的集合。主要写在切面类里面,用 @Pointcut 来标注某个方法为一个切入点方法。如:@Pointcut("execution(public * cn.hyl.aop.service.* . (…))");切入点表达式规则:修饰符(可以不写,但不能用代替)+ 返回类型(可用 * 号指代不限返回类型)+ 包路径下的类(可用 * 指代所有的类)+ 哪些方法(可用 * 指代此类下的所有方法)+(…)(参数不限个数不限类型)

36、什么是通知(Advice)

在特定切点处处,切面所采取的动作称为通知。动作是在切点处的什么时间增强,增强什么内容

通知注解有:

  • @Before:前置通知(在切入目标方法执行之前执行)
  • @After:后置通知(在目标方法执行之后执行,无论是否发生异常)
  • @AfterReturning:返回通知(在目标方法返回结果之后执行)
  • @AfterThrowing:异常通知(在目标方法抛出异常之后执行)
  • @Around:环绕通知(围绕着方法执行)

37、关注点(concern)和横切关注点(cross-cutting concern)有什么不同

concern:
是我们想要在应用程序的特定模块中定义的行为。它可以定义为我们想要实现的功能

cross-cutting concern:
是一个适用于整个应用的行为,这会影响整个应用程序。例如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要关注的问题,因此它们是跨领域的问题

38、AOP 底层用什么实现

两种

  • 静态代理:指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强
  • 动态代理:CGLIB、JDK 动态代理

39、Spring AOP 和 AspectJ AOP 有什么区别

  1. Spring AOP 是 Spring 支持的面向切面 AOP 编程;AspectJ 是一个面向切面的框架,它扩展了 Java 语言,AspectJ 定义了 AOP 语法
  2. Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现
  3. Spring AOP 属于运行时增强;AspectJ 属于编译时增强
  4. Spring AOP 创建目标对象的代理,切面在代理中执行;AspectJ 执行程序前,各方面直接织入代码中
  5. Spring AOP 仅支持方法级别的 PointCut;AspectJ 提供了完全的 AOP 支持,它还支持属性级别的 PointCut
  6. AspectJ 的运行速度要快于 Spring AOP

40、什么是编织(Weaving)

为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编织(Weaving)。在 Spring AOP 中,编织在运行时执行

41、Spring MVC 框架有什么用

Spring MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。MVC 模式有助于分离应用程序的不同方面,如:输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合

42、描述一下 SpringMVC 的请求处理的全过程

SpringMVC 的四大组件:

  1. DispacherServlet:调度中心
  2. HandlerMapping:处理映射器。维护一个Map,用来保存请求路径和类名方法名的映射关系
  3. HandlerAdapter:处理适配器。用来处理参数、返回值
  4. ViewResovler:视图解析器。将代码转化为视图

前后端不分离的项目:
在这里插入图片描述
前后端分离项目:

分离项目返回为 JSON 数据,没有 ModelAndView 对象。所以 HandlerAdapter 会经过适配请求一个合适的处理器 Handler,它检查方法上添加了@ResponseBody,然后通过 HttpMessageConverter 来返回结果并转换为 JSON 响应

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄天灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值