Spring面试整合
什么是Spring Framework
Spring 是一个开源的应用框架,目的是降低程序开发的复杂度。
具有的特点有:轻量级与低耦合,支持AOP与IOC
它是分层的体系结构,能够运行用户选择组件,同时能够整合其他框架,如mybatis等
SpringFramework特点
- 轻量级:spring在代码量和透明度方面都很轻便
- 非入侵式 : 基于Spring开发的应用程序可以不用依赖spring的API
- IOC:控制反转,降低系统间耦合
- AOP:面向切面,能够将业务逻辑与系统服务分离,实现高内聚
- 容器 :对象的生命周期和配置都交由容器负责
- MVC:对 web 应用提供了高度可配置性,其他框架的集成也十分方便。
- 容器化:Spring 是一个容器,因为它包含并且管理应用对象的生命周期
- 组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象
列举一些spring重要的模块
上图中包含了 Spring 框架的所有模块,这些模块可以满足一切企业级应用开发的需求,在开发过程中可以根据需求有选择性地使用所需要的模块。
Core Container(Spring的核心容器)

核心容器是建立其他模块的基础,没有这些模块,就不会有AOP,Web等的上层模块的功能
Beans模块:
提供了框架的基础部分,包括控制反转和依赖注入
Core模块:
封装了Spring的底层部分,包括资源访问,类型转化和一些工具类
Context模块:
此模块是建立在Beans模块和Core模块基础之上的,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。
SpEL 模块:
提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。
Data Access/Integration(数据访问/集成)

JDBC 模块:
提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。
ORM 模块:
提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。
OXM 模块:
提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。
JMS 模块:
指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Transactions 事务模块:
支持编程和声明式事务管理。

Web模块

Web 模块:
提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。
Servlet 模块:
提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。
WebSocket 模块:
提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。
Webflux 模块:
Spring WebFlux 是 Spring Framework 5.x中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。Spring WebFlux 用于创建基于事件循环执行模型的完全异步且非阻塞的应用程序。
AOP、Aspects、Instrumentation和Messaging

AOP 模块:
提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。
Aspects 模块:
提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
Instrumentation 模块:
提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
messaging 模块:
Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。
jcl 模块:
Spring 5.x中新增了日志框架集成的模块。

Test模块

Test 模块:
Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。
包含Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient。

什么是spring配置文件
spring配置文件是XML文件,作用是描述类的配置以及互相引入关系。由于XML配置较为冗余,所以大型项目使用XML配置文件很难管理
IOC
什么是Spring IOC 容器
Spring框架的核心就是 IOC容器。容器的作用是创建对象并把它们通过依赖关系装配在一起,通过配置管理Bean的生命周期。 Spring容器通过 DI 依赖注入来管理组件

容器通过读取配置数据和类数据进行对象的实例化,配置数据可以由XML文件,注解或Java代码提供
什么是依赖注入 DI
在依赖注入中,不必由用户手动创建对象,但是必须描述他们。不是在代码中将组件和服务联系在一起,而是通过描述配置服务需要用到的组件,有IOC容器将他们装配在一起
DI与IOC的关系
控制反转IOC是通过依赖注入DI实现的,换言之,IOC是设计思想,DI是实现方式
依赖注入的方式
- 构造函数注入
- setter 注入
- 接口注入
在Spring 中,仅提供构造器和setter注入
构造器和setter注入的区别

Spring 中有多少中IOC容器
两种:
- BeanFactory :一个包含的bean集合的工厂类,会在客户端要求的时候去实例化Bean,一般由系统调用
- ApplicationContext :在BeanFactory的基础上做了扩展,提供了额外功能,一般由用户调用

AOP
什么是AOP
AOP是一套程序设计的规范,指的是面向切面编程,而OOP(面向对象编程)同样是一套程序设计规范。
在AOP的编程思想中,通过对程序处理的流程进行抽取,面向的是业务流程中的某个步骤,以获取逻辑步骤之间的隔离,封装的结果是一个切面。
对应的OOM编程思想,是针对业务处理过程中的属性(字段),行为(方法)进行抽取封装,封装的结果是一个类。
AOP中的术语
-
连接点:表示在业务流程中能够插入功能的扩展点,类似于插槽,连接点可能是类初始化。方法调用,字段调用,异常处理等等时间节点,Spring只支持方法执行连接点。 ** 表示在具体的哪里操作**
-
切入点: 一组连接点的集合,上面的连接点表示的是具体的某一个类上的某一个方法,而切入点指的是一组有着相同需求的连接点的合集 表示在那些地方操作
-
通知: 表示的是在连接点上执行的行为 ,通知提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置通知(before advice)、后置通知(after advice)、环绕通知(around advice),在Spring中通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入通知; 表示干什么
-
**切面: 横切关注点的集合模块,比如上边提到的日志组件,就是一个切面。可以认为是通知、引入和切入点的组合; ** AOP中的切面就类似于OOP中的类,是一个具体的模块
-
**引入:**引入就是在一个接口的基础上引入新的接口增强功能。
-
目标对象: 需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被通知的对象,从而也可称为被通知对象;由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象,在AOP中表示为对谁干;
-
织入: 把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。在AOP中表示为怎么实现的;
-
**AOP代理:**织入的一种具体实现方式

AOP是实现方式
AOP的实现方式在于代理模式,分为动态代理实现与静态代理实现
- 动态代理(Spring AOP):所谓的动态代理就是AOP框架不会去修改字节码,而是在每次运行时生成临时的AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特点的切入点做了增强处理,
- 静态代理(AspectJ):所谓静态代理,就是AOP框架会在编译阶段就生成AOP代理类,他会在编译阶段将切面直接织入到字节码中,这样程序在运行时就是运行的增强的AOP对象了
Spring中两种代理方式
Spring提供了JDK动态代理和Cglib动态代理,具体使用那种方式有AopProxyFactory根据配置来决定。
默认情况下,如果目标是接口,就使用JDK动态代理,否则使用Cglib动态代理。
- JDK动态代理:主要涉及Proxy与InvocationHandler。
InvocationHandler是一个接口:通过实现该接口定义横切逻辑,并通过反射调用目标代码,进 而将切面织入切点
Proxy 类:利用 InvocationHandler 动态创建一个符合某一接口的实例,生成目标类的代 理对象。
- CGLib动态代理:CGLib是一个高性能的代码生成类库,**可以在运行期间扩展Java类与实现Java接口,**由于JDK动态代理只能为实现接口的类做增强,没有办法对无接口的类做增强,这时候就需要用到CGLib创建动态代理对象。
Spring通知类型
在AOP术语中,切面的工作被称之为通知。
- 前置通知:分法执行之前进行增强
- 后置通知:方法执行之后进行增强,此时不会关系被增强方法输出值
- 返回通知:方法执行后增强,可获取到方法输出值
- 异常通知:方法抛出异常后进行增强
- 环绕通知:增强包裹了被通知方法,方法调用之前和之后都会执行自定义行为
AspectJ与Spring AOP区别
AspectJ是更强的AOP框架,是实际意义的AOP标准(因为AspcetJ能够支持所有的AOP场景[ 字段连接点,构造器连接点等 ],而SpringAOP只支持方法层面的增强) Spring相当于轻量级别的AOP框架

Bean
什么是SpringBean?
Spring里面的bean就类似是定义的一个组件,而这个组件的作用就是实现某个功能的
- bean是构成用户应用程序的主干对象
- Bean由IOC容器管理(实例化,配置,装配)
- Bean是基于用户提供的元数据配置创建的
Spring 提供了哪些配置方式
XML配置
顾名思义,就是将bean的信息配置.xml文件里,通过Spring加载文件为我们创建bean。这种方式出现很多早前的SSM项目中,将第三方类库或者一些配置工具类都以这种方式进行配置,主要原因是由于第三方类不支持Spring注解。
- 优点: 可以使用于任何场景,结构清晰,通俗易懂
- 缺点: 配置繁琐,不易维护,枯燥无味,扩展性差
Java配置
将类的创建交给我们配置的JavcConfig类来完成,Spring只负责维护和管理,采用纯Java创建方式。其本质上就是把在XML上的配置声明转移到Java配置类中
- 优点:适用于任何场景,配置方便,因为是纯Java代码,扩展性高,十分灵活
- 缺点:由于是采用Java类的方式,声明不明显,如果大量配置,可读性比较差
注解配置
通过在类上加注解的方式,来声明一个类交给Spring管理,Spring会自动扫描带有@Component,@Controller,@Service,@Repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。
- 优点:开发便捷,通俗易懂,方便维护。
- 缺点:具有局限性,对于一些第三方资源,无法添加注解。只能采用XML或JavaConfig的方式配置
bean的scope?
Spring bean 支持 5 种scope
- Singleton(单例):单实例
- Prototype(原型):每次调用都会创建新的实例
- Request:每次HTTP请求都会创建一个新实例,切仅在当前HTTP请求内有效
- Session :每次HTTP请求都会创建一个实例,切仅在当前session中有效
- Global-session:基于spring自己的Session管理体系下的作用域
后三种仅在用户支持Web的ApplicationContext时才可用
bean容器内的生命周期
- 根据配置和类信息实例化bean
- 使用DI依赖注入填充属性
- 配置bean的BeanName,BeanFactory等属性
- 如果bean指定了init方法,执行init方法
- 初始化完成,
- 当容器关闭时,若bean指定了destroy,执行destroy方法
什么是Spring装配
bean在IOC容器中组合在一起,这种行为称为bean装配,容器需要知道需要什么bean已经使用何种方式注入来实现装配
自动装配的方式
Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协作者。
- no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。
- byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。
- byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。
- 构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。
- autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。
在程序中使用@autowired等注解显示声明此字段需要被自动装配
自动装配的局限
- 被覆盖的可能性,使用显示指定依赖项的话会覆盖掉自动装配
- 基本属性无法装配
- 同类型同名的类会引发冲突导致无法装配
注解
Spring常用注解
- @Controller - 用于 Spring MVC 项目中的控制器类。 标志他为一个组件
- @Service - 用于服务类。标志他为一个组件
- @RequestMapping - 用于在控制器处理程序方法中配置 URI 映射。
- @ResponseBody - 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。
- @PathVariable - 用于将动态值从 URI 映射到处理程序方法参数。
- @Autowired - 用于在 spring bean 中自动装配依赖项。
- @Qualifier - 使用 @Autowired 注解,以避免在存在多个 bean 类型实例时出现混淆。
- @Scope - 用于配置 spring bean 的范围。
- @Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。
- @Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP)。
@Component, @Controller, @Repository, @Service 有何区别?
- @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
- @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。
- @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。
- @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。
Autowired注解的作用
@Autowired的作用是精确的控制在何处以及如何进行自动装配,默认使用byType注入,可用在setter方法,构造函数,字段或具有参数的方法上。
Qualifier注解的作用
此组件通常和Autowired注解连用,作用是当自动装配出现歧义时(类名类型都相同),使用此注解具体指定注入哪个类
@RequestMapping 注解有什么用?
@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注解可应用于两个级别:
- 类级别:映射请求的 URL
- 方法级别:映射 URL 以及 HTTP 请求方法
MVC
MVC是什么
Spring的模型视图控制器(MVC)是围绕着DispatcherServlet来设计的,这个中心Servlet会吧请求通过映射分法给各个处理器(controller),并且能够支持可配置的处理器映射、本地视图渲染、时区、主题渲染、文件上传等增强功能
MVC执行流程

- HTTP请求到DispatcherServlet
- 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到能够处理请求的Controller
- DispatcherServlet将请求提交到Controller
- Controller执行业务调用得到ModelAndView,
- 将ModelAndView返回中央控制器
- DispatcherServlet请求视图处理器处理视图映射,返回视图对象
- 进行视图渲染
- 将结果进行响应
更多推荐




所有评论(0)