【 Spring 面试题 】

Spring 概述

1. 什么是 Spring?

Spring 是一个 开源框架,是于 2003 年兴起的一个 轻量级 的 Java 开发框架,其基础版本只有 2 MB 左右的大小。

Spring 框架目标是简化Java企业级应用开发,通过启用基于 POJO 编程模型来促进良好的编程实践。

Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。

Spring 是一个轻量级的控制反转(IoC)面向切面(AOP)容器框架

2. 使用 Spring 框架的好处是什么?

  • 方便解耦,简化开发:Spring 就是一个大工厂,专门负责生成 Bean,可以将所有对象创建和依赖关系维护由Spring 管理

  • AOP编程的支持:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

  • 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程

  • 方便程序的测试:Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序

  • 方便集成各种优秀框架:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的支持

  • 降低JavaEE API的使用难度:Spring 对 JavaEE 开发中一些难用的API(JDBC、JavaMail、远程调用 webservice 等),都提供了封装,使这些 API 应用难度大大降低

3. 控制反转(IoC)与依赖注入(DI)

IoC:Inverse of Control 反转控制的概念,就是将原本在程序中手动创建 UserService 对象的控制权,交由 Spring 框架管理,简单说,就是创建 UserService 对象控制权被反转到了 Spring 框架

DI:Dependency Injection 依赖注入,在 Spring 框架负责创建 Bean 对象时,动态的将依赖对象注入到 Bean 组件

在这里插入图片描述

IOC即控制反转,一种将控制权转移的设计模式,由传统的程序控制转移到容器控制;

DI即依赖注入,将相互依赖的对象分离,在Spring的配置(注解)中描述它们之间的依赖关系,这些依赖关系也只在使用时才被建立。

AOP即面向切面,一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。

Spring的AOP和IOC都是为了解决代码的耦合度的实际应用,使得代码的重用度变高,便于维护。但这些都不是Spring中特有的,我们可以说Spring将它们应用的更灵活。

面试题: IoC 和 DI的区别?
IoC 控制反转,指将对象的创建权,反转到 Spring 容器。
DI 依赖注入,指 Spring 创建对象的过程中,将对象依赖属性通过配置进行注入。
IoC 是容器,我们将对象注入到容器中,要用时在目标处使用 DI(依赖注入)即可。

在Java中依然注入有以下三种实现方式:

构造器注入
Setter方法注入
接口注入

4.面向切面(AOP

Spring 框架的一个关键组件是面向切面的程序设计(AOP)框架。一个程序中跨越多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样常见的很好的关于方面的例子,比如日志记录、声明性事务、安全性,和缓存等等。

在 OOP 中模块化的关键单元是类,而在 AOP 中模块化的关键单元是切面。AOP 帮助你将横切关注点从它们所影响的对象中分离出来,然而依赖注入帮助你将你的应用程序对象从彼此中分离出来。

Spring 框架的 AOP 模块提供了面向切面的程序设计实现,可以定义诸如方法拦截器和切入点等,从而使实现功能的代码彻底的解耦出来。使用源码级的元数据,可以用类似于.Net属性的方式合并行为信息到代码中。

5. Spring 由哪些模块组成?

https://blog.csdn.net/weixin_42112635/article/details/87739625

6. 核心容器(应用上下文) 模块

这是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器。

Spring BeanFactory 容器 和 Spring ApplicationContext 容器:
https://blog.csdn.net/weixin_42112635/article/details/87779869

加载 Spring 容器的三种方式 :https://blog.csdn.net/weixin_42112635/article/details/87777590

7. BeanFactory 接口和 ApplicationContext 接口有什么区别 ?

  • ApplicationContext 接口继承 BeanFactory 接口,Spring 核心工厂是BeanFactory ,BeanFactory 采取延迟加载,第一次 getBean 时才会初始化Bean,ApplicationContext 是会在加载配置文件时初始化 Bean。
  • ApplicationContext 是对 BeanFactory 扩展,它可以进行国际化处理、事件传递和 bean 自动装配以及各种不同应用层的Context实现

开发中基本都在使用 ApplicationContext,web 项目使用WebApplicationContext ,很少用到 BeanFactory。

在这里插入图片描述

8. Spring 配置 bean 实例化有哪些方式?

1)使用类构造器实例化(默认无参数)
2)使用静态工厂方法实例化(简单工厂模式)
3)使用实例工厂方法实例化(工厂方法模式)

具体请看:
https://blog.csdn.net/weixin_42112635/article/details/87785083

9. Spring 支持的五种 bean 的作用域

  • singleton : bean在每个Spring ioc 容器中只有一个实例。
  • prototype:一个bean的定义可以有多个实例。
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

缺省的Spring bean 的作用域是Singleton

具体请看:https://blog.csdn.net/weixin_42112635/article/details/87787724

10. Spring的生命周期?

https://blog.csdn.net/weixin_42112635/article/details/87934020

11. Bean注入属性有哪几种方式?

在这里插入图片描述

spring支持构造器注入和setter方法注入

  • 构造器注入,通过 <constructor-arg> 元素完成注入
  • setter方法注入, 通过<property> 元素完成注入【开发中常用方式】

https://blog.csdn.net/weixin_42112635/article/details/87936153

12. 什么是Spring的依赖注入?

依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

13. 一个 Spring Bean 定义 包含什么?

一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。

14. 如何给Spring 容器提供配置元数据?

这里有三种重要的方法给Spring 容器提供配置元数据。

XML配置文件。

基于注解的配置。

基于java的配置。

15. 什么是bean装配?

装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。

16. 什么是bean的自动装配?

Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。

17. 解释不同方式的自动装配 。

有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。

  • no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
  • byName:通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
  • byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
  • constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
  • autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

18.自动装配有哪些局限性 ?

自动装配的局限性是:

重写: 你仍需用 和 配置来定义依赖,意味着总要重写自动装配。
基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。
模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。

19. 你可以在Spring中注入一个null 和一个空字符串吗?

可以。

20. 基于注解的 IoC 配置

https://blog.csdn.net/weixin_42112635/article/details/88833845

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

编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
49. Spring框架的事务管理有哪些优点?
它为不同的事务API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。
它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如
它支持声明式事务管理。
它和Spring各种数据访问抽象层很好得集成。
50. 你更倾向用那种事务管理类型?
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。

Spring面向切面编程(AOP)

  1. 解释AOP
    面向切面的编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

  2. Aspect 切面
    AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

  3. 在Spring AOP 中,关注点和横切关注的区别是什么?
    关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
    横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

  4. 连接点
    连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。

  5. 通知
    通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。

Spring切面可以应用五种类型的通知:

before:前置通知,在一个方法执行前被调用。
after: 在方法执行之后调用的通知,无论方法执行是否成功。
after-returning: 仅当方法成功完成后执行的通知。
after-throwing: 在方法抛出异常退出时执行的通知。
around: 在方法执行之前和之后调用的通知。
56. 切点
切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

  1. 什么是引入?
    引入允许我们在已存在的类中增加新的方法和属性。

  2. 什么是目标对象?
    被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

  3. 什么是代理?
    代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

  4. 有几种不同类型的自动代理?
    BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Metadata autoproxying

  1. 什么是织入。什么是织入应用的不同点?
    织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。

织入可以在编译时,加载时,或运行时完成。

  1. 解释基于XML Schema方式的切面实现。
    在这种情况下,切面由常规类以及基于XML的配置实现。

  2. 解释基于注解的切面实现
    在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。

Spring 的MVC

  1. 什么是Spring的MVC框架?
    Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。

  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到一个类或一个特定的方处理法上。

猜你喜欢

转载自blog.csdn.net/weixin_42112635/article/details/88842752