Spring 面试题

一、Spring概述

1.什么是Spring框架?

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

Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injection,DI)面向切面编程(aspect-oriented programming,AOP)

2.Spring的俩大核心概念?

IOC指的是控制反转,把对象的创建和依赖关系的维护交给Spring容器去管理。Spring通过工厂模式、反射机制等技术管理对象的作用域和生命周期。

AOP称为面向切面编程,是面向对象的一种补充,将程序中独立于其他功能的方法抽取出来,使Java开发模块化,仅需专注于主业务即可。

3.Spring框架的设计目标,设计理念,和核心是什么?

  • Spring框架的核心:IOC容器和AOP模块。通过IOC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。

4.列举一些重要的Spring模块?

  • Spring Core模块:基础,可以说Spring其他所有的功能都依赖于该类库。主要提供IOC和DI功能。
  • Spring Test:提供了对JUnit和TestNG测试的支持。
  • Spring Web:为创建Web应用程序提供支持。
  • 数据访问和集成模块,如Spring JDBC:Java数据库连接;Spring ORM:用于支持Hibernate等ORM工具。

  • Spring AOP:提供面向切面的编程实现。
  • Spring Aspects:该模块为与AspectJ的集成提供支持。
  • Instrumentation:该层为类检测和类加载器实现支持。
  • Messaging:模块为集成messaging api和消息协议提供支持。

5.详细讲解一下核心容器模块(或模块作用)

Core Container(核心容器),Spring的核心容器是其他模块建立的基础,它主要由Beans模块、Core模块、Context模块、Context-support模块和SpEL(Spring Expression Language,Spring表达式语言)模块组成,具体介绍如下。

  1. Beans模块:提供了BeanFactory,用来创建对象的实例,Spring将管理对象称为Bean。
  2. Core核心模块:提供了Spring框架的基本组成部分,包括IoC和DI功能。
  3. Context上下文模块:建立在Core和Beans模块的基础之上,它是访问定义和配置的任何对象的媒介。其中ApplicationContext接口是上下文模块的焦点。
  4. Context-support 模块:提供了对第三方库嵌入 Spring 应用的集成支持,比如缓存(EhCache、Guava、JCache)、邮件服务(JavaMail)、任务调度(CommonJ、Quartz)和模板引擎(FreeMarker、JasperReports、速率)。
  5. SpEL模块:是Spring 3.0后新增的模块,它提供了Spring Expression Language支持,是运行时查询和操作对象图的强大的表达式语言。

6.Spring 框架中都用到了哪些设计模式?

  • 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
  • 单例模式:Bean默认为单例模式。
  • 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
  • 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
  • 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。

7.Spring框架中有哪些不同类型的事件

Spring 提供了以下5种标准的事件:

  1. 上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
  2. 上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
  3. 上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
  4. 上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
  5. 请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。

8.什么是Spring配置文件?

Spring配置文件是XML文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。但是,XML配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难。

二、控制反转和依赖注入

1、什么是Spring IOC容器?

Spring框架的核心是Spring容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过XML,Java注解或Java代码提供。

2、控制反转和依赖注入

Spring 的 IOC 和 AOP_lalajh的博客-CSDN博客

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

  1. 构造函数注入:调用被注入对象的构造方法注入,对象在构造完成就进入了就绪状态。
  2. 属性注入:Autowired属性赋值。
  3. Setter注入:调用setter/getter方法。

可以通过多少种方式完成依赖注入? - 知乎

4、区分构造函数注入和setter注入?

在这里插入图片描述

 5、spring中有多少种IOC容器?

BeanFactory-BeanFactory就像一个包含bean集合的工厂类。它会在客户端要求时实例化bean。

ApplicationContext-ApplicationContext 接口扩展了BeanFactory接口。它在BeanFactory基础上提供了一些额外的功能。

6、Spring IoC的实现机制?

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

7、控制反转和依赖注入

依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

IOC控制反转,指将对象的创建权,反转到Spring容器 , 
DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。

Beans

1、什么是spring bean?

2、 spring提供了哪些配置方式?

基于xml配置

bean所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多bean定义和特定于应用程序的配置选项。它们通常以bean标签开头。例如:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean"> <property name="name" value="Edureka"></property> </bean>

基于注解配置

您可以通过在相关的类,方法或字段声明上使用注解,将bean配置为组件类本身,而不是使用XML来描述bean装配。默认情况下,Spring容器中未打开注解装配。因此,您需要在使用它之前在Spring配置文件中启用它。例如:

<beans> <context:annotation-config/> <!-- bean definitions go here --> </beans>

基于Java API配置

Spring 的 Java配置是通过使用@Bean和@Configuration 来实现。

1、 @Bean注解扮演与元素相同的角色。

2、 @Configuration类允许通过简单地调用同一个类中的其他@Bean方法来定义bean间依赖关系。

3、spring支持集中bean scope?

Spring支持以下6中bean scopes:

singleton: 单例模式(默认值),在Spring容器中只会创建一个实例。
prototype: 原型模式,每次通过Spring容器获取bean时,容器都会新建一个实例。
request: 每次HTTP请求都会创建一个实例,但只在http request范围有效。
session: ​在http session生命周期内,共享一个实例,不同session有不同的实例。
application: 在ServletContext生命周期内,只有一个实例。
webSocket: 在webSocket范围内只有一个实例。

4、spring 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属性),那么将调用它。

5、什么是spring的内部bean?

只有将bean用作另一个bean的属性时,才能将bean声明为内部bean。

6、什么是spring装配?

当bean在Spring容器中组合在一起时,它被称为装配或bean装配。Spring容器需要知道需要什么bean以及容器应该如何使用依赖注入来将bean绑定在一起,同时装配bean。

7、自动装配有哪些方式?

no - 这是默认设置,表示没有自动装配,使用ref。应使用显式 bean 引用进行装配。
byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML文件中由相同名称定义的 bean。
byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。

构造函数- 它通过调用类的构造函数来注入依赖项。它有大量的参数。
autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。

8、自动装配有什么局限?

覆盖的可能性 - 您始终可以使用 和 设置指定依赖项,这将覆盖自动装配。基本元数据类型 - 简单属性(如原数据类型,字符串和类)无法自动装配。令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。

注解

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

不使用 XML 来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上,使用注解将配置移动到组件类本身。它可以作为 XML 设置的替代方案。例如:Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。@Bean 注解扮演与 元素相同的角色。 @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。

@Configuration 
public class StudentConfig {
@Bean 
public StudentBean myStudent() {
		return new StudentBean();
	}
}

2、如何在spring中启动注解装配?

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

3、常见注解

@component是spring中的一个注解,它的作用就是声明为bean,交给IOC容器管理。

web开发,提供3个@Component注解衍生注解(功能一样)取代
@Repository(“名称”):dao层
@Service(“名称”):service层
@Controller(“名称”):web层

@Autowired:自动根据类型注入

如果容器中有多个相同类型的 bean,用下面这个注解了。
@Qualifier(“名称”):指定自动注入的id名称

4、@RequestMapping注解有什么用?@Service有何区别?

@RequestMapping 注解用于将特定HTTP请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:

类级别:映射请求的URL方法级别:映射URL以及HTTP请求方法

数据访问

1、spring DAO有什么用?

答:

Spring DAO使得JDBC,Hibernate或JDO这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。

2、列举Spring DAO抛出的异常

1)CleanupFailureDataAccessException 一项操作成功地执行,但在释放数据库资源时发生异常(例如,关闭一个Connection)
2)DataAccessResourceFailureException 数据访问资源彻底失败,例如不能连接数据库
3)DataIntegrityViolationException Insert或Update数据时违反了完整性,例如违反了惟一性限制
4)DataRetrievalFailureException 某些数据不能被检测到,例如不能通过关键字找到一条记录
5)DeadlockLoserDataAccessException 当前的操作因为死锁而失败
6)IncorrectUpdateSemanticsDataAccessException Update时发生某些没有预料到的情况,例如更改超过预期的记录数。当这个异常被抛出时,执行着的事务不会被回滚
7)InvalidDataAccessApiUsageException 一个数据访问的JAVA API没有正确使用,例如必须在执行前编译好的查询编译失败了
8)InvalidDataAccessResourceUsageException 错误使用数据访问资源,例如用错误的SQL语法访问关系型数据库
9)OptimisticLockingFailureException 乐观锁的失败。这将由ORM工具或用户的DAO实现抛出
10)TypemismatchDataAccessException Java类型和数据类型不匹配,例如试图把String类型插入到数据库的数值型字段中
11)UncategorizedDataAccessException 有错误发生,但无法归类到某一更为具体的异常中
 

3、spring JDBC API中存在哪些类?

  • JdbcTemplate
  • SimpleJdbcTemplate
  • NamedParameterJdbcTemplate
  • SimpleJdbcInsert
  • SimpleJdbcCall

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

使用 Hibernate 模板和回调进行控制反转

扩展 HibernateDAOSupport 并应用 AOP 拦截器节点

5、列举spring支持的事务管理类型

Spring支持两种类型的事务管理:

1、 程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维护起来非常困难。

2、 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML的配置来管理事务。

6、spring支持哪些ORM框架

 AOP

1、什么是AOP

AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP不同的抽象软件结构的视角,在OOP中, 我们以类(class)作为我们的基本单元, 而AOP中的基本单元是Aspect(切面)

2、AOP基础概念

- Joinpoint(连接点):就是方法
- Pointcut(切入点):就是挖掉(或者具有)共性功能的方法
- Advice(通知):就是共性功能,最终以一个方法的形式呈现
- Aspect(切面):就是共性功能与挖的位置的对应关系。从哪里挖的
- Target(目标对象):就是挖掉功能的方法对应的类产生的对象,这种对象是无法直接完成最终工作的
- Weaving(织入):就是将挖掉的功能回填的动态过程
- Proxy(代理):目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现
- Introduction(引入/引介) :就是对原始对象无中生有的添加成员变量或成员方法
- 通知类型:就是通知是前面的还是后面的

3、有哪些类型的通知(Advice)?

@Before:前置通知,在调用目标方法之前执行通知定义的任务
@After:后置通知,在目标方法执行结束后,无论执行结果如何,都要执行通知定义的任务。
@AfterReturning:返回通知,在目标方法执行结束后,如果执行成功,则执行通知定义的任务。
 @AfterThrowing:异常通知,如果目标方法执行过程中抛出异常,则执行通知定义的任务。
 @Around:环绕通知,在目标方法执行前和执行后,都需要执行通知定义的任务。

4、AOP有哪些实现方式?

答:

实现AOP的技术,主要分为两大类 :

静态代理

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

JDK动态代理

CGLIB

5、Spring AOP and AspectJ AOP有什么区别?

Spring AOP基于动态代理方式实现;AspectJ基于静态代理方式实现。SpringAOP仅支持方法级别的PointCut;提供了完全的 AOP支持,它还支持属性级别的PointCut。

6、如何理解Spring中的代理?

将Advice应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。

Advice + Target Object = Proxy

7、什么是编织(Weaving)?

见上

MVC

1、Spring MVC框架有什么用?

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

2、DispatcherServlet

Spring 的 MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。

3、WebApplicationContext

WebApplicationContext继承了ApplicationContext并增加了一些WEB应用必备的特有功能,它不同于一般的 ApplicationContext ,因为它能处理主题,并找到被关联的servlet。

4、什么是Spring MVC框架的控制器?

控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。

5、@Controller注解

该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。

6、@RequestMapping注解

该注解是用来映射一个URL到一个类或一个特定的方处理法上。

7、描述一下DispatcherServlet的工作流程

1、向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。

2、 DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 (处理器映射器) HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对 象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。

3、 DispatcherServlet 根据获得的**(处理器对象) Handler**,选择一个合适的 (处理器适配置器)HandlerAdapter。(附注:如果成功获得 HandlerAdapter 后,此时将开始 执行拦截器的 preHandler(…)方法)。

4、提取 Request 中的模型数据,填充 (处理器对象) Handler 入参,开始执行 Handler ( Controller)。在填充 Handler 的入参过程中,根据你的配置, Spring 将 帮你做一些额外的工作:

HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换 成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换。如 String 转换成 Integer、 Double 等。
数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字 或格式化日期等。
数据验证:验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。
5、Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;

6、根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已 经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet。

7、 ViewResolver 结合 Model 和 View,来渲染视图。

8、视图负责将渲染结果返回给客户端。
 

参考:

Java 全栈知识点问题汇总(下) | Java 全栈知识体系

(1条消息) Spring 面试题(总结最全面的面试题!!!)_小杰要吃蛋的博客-CSDN博客_spring面试题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值