Java面试题整理——Spring综合

Java面试题整理

Spring综合


1.Spring特点概述?

  • 1)简介
    目的:解决企业应用开发的复杂性。
    功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能。
    范围:任何Java应用。

    简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

  • 2)轻量
    从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型的,Spring应用中的对象不依赖于Spring的特定类。

  • 3)控制反转
    Spring通过一种称作控制反转(IOC)的技术促进了松耦合。当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IOC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对 象请求就主动将依赖传递给它。

  • 4)面向切面
    Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关 注点,例如日志或事务支持。

  • 5)容器
    Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而, Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

  • 6)框架
    Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

2.解释一下什么是 IOC?

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。

IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间解耦。如下图:

IOC理论实现图解
IOC容器成了整个系统的关键核心,它起到一种类似于“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用。如果把IOC容器拿掉整个系统的对象是没有直接耦合关系的,对象直接的依赖关系已经降到最低程度。

IOC理论实现图解
我们再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对比一下:

  • 软件系统在没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论怎样,控制权都在自己手上。
  • 软件系统在引入IOC容器之后,这种情形就完全改变了,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

通过前后的对比,我们不难看出:对象A获得依赖对象B的过程由主动行为变成了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

3.Spring 有哪些主要模块?

Spring框架至今已集成20多个模块。这些模块只要被分如下图所示的核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。

在这里插入图片描述

4.Spring 常用的注入方式?

Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:

  • 构造方法注入
  • Setter注入
  • 基于注解的注入

5.Spring 中的 Bean 是线程安全的吗?

容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特征,但是具体还是要结合具体Scope的Bean去研究。

6.Spring 自动装配 Bean 有哪些方式?

Spring容器负责创建应用程序中的Bean同时通过ID来协调这些对象之间的关系。作为开发人员,我们需要告诉Spring要创建哪些Bean并且如何将其装配到一起。
Spring中Bean装配有两种方式,可以配合使用:

  • 隐式的Bean发现机制和自动装配。
  • 在Java代码或者XML中进行显示配置。

7.Spring MVC 有哪些组件?

Spring MVC的核心组件:

  • DispatcherServlet:中央控制器,把请求给转发到具体的控制类。
  • Controller:具体处理请求的控制器。
  • HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略。
  • ModelAndView:服务层返回的数据和视图层的封装类。
  • ViewResolver:视图解析器,解析具体的视图。
  • Interceptors:拦截器,负责拦截我们定义的请求然后做处理工作。

8.简述 Spring MVC 运行流程?

SpringMVC运行流程
流程描述:

  • 1)用户向服务器发送请求,请求被Spring前端控制Servlet DispatcherServlet捕获;

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

  • 3)DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter;(如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)

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

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

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

  • 7)ViewResolver结合Model和View,来渲染视图;

  • 8)将渲染结果返回给客户端。

9.SpringBoot 配置文件有哪几种类型?有什么区别?

Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件。相对于properties文件而言,yml文件更年轻,也有很多的坑。yml通过空格来确定层级关系,使配置文件结构更清晰,但也会因为微不足道的空格而破坏了层级关系。

10.什么是 SpringCloud?

从字面理解,SpringCloud 就是致力于分布式系统、云服务的框架。

SpringCloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具:
服务注册与发现、配置管理、断路器、智能路由、服务间调用、负载均衡、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态、分布式消息…

使用 SpringCloud 开发人员可以开箱即用的实现这些模式的服务和应用程序。这些服务可以任何环境下运行,包括分布式环境。也包括开发人员自己的笔记本电脑以及各种托管平台。

11.SpringCloud 的核心组件有哪些?

  • 服务发现——Netflix Eureka:一个Restful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个Java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
  • 客户端负载均衡——Netflix Ribbon:Ribbon。主要提供客户侧的软件负载均衡算法。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可拔插、可定制的负载均衡组件。
  • 断路器——Netflix Hystrix:断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费CPU周期,而它确定该故障是持久。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。
  • 服务网关——Netflix Zuul:类似于Nginx,反向代理的功能,不过Netflix自己增加了一些配合其他组件的特性。
  • 分布式配置——Spring Cloud Config:这个还是静态的,得配合Spring Cloud Bus实现动态地配置更新。

12.SpringBoot 和 SpringCloud 的区别?

  • SpringBoot 专注于快速方便的开发单个个体微服务。
  • SpringCloud 是关注全局的微服务协调整理治理框架,它将 SpringBoot 开发的一个个单体微服务整合并管理起来。
  • 为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务。
  • SpringBoot 可以离开 SpringCloud 独立使用开发项目,但是 SpringCloud 离不开 SpingBoot ,属于依赖的关系。

13.Zuul 和 Nginx 的区别?

  • Zuul 是 Java 语言实现的,主要为 Java 服务提供网关服务,尤其在微服务架构中可以更加灵活的对网关进行操作。
  • Nginx是使用 C 语言实现,性能高于 Zuul,但是实现自定义操作需要熟悉 lua 语言,对程序员要求较高,可以使用 Nginx 做 Zuul 集群。

14.Ribbon 和 Nginx 的区别?

  • Ribbon 是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作。
  • Nginx 是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据 upstream 配置进行转发,相当于请求通过 nginx 服务器进行转发。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

绯色灬观月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值