Spring Framework

1、不同版本的Spring Framework 有哪些主要功能?

2、 什么是Spring Framework?

是一款轻量级、松耦合的开源应用框架。具有分层体系结构,允许用户选择组件,

3、列举Spring Framework的优点?

4、Spring Framework有哪些不同的功能?

IOC — 控制反转
AOP— 面向切面编程,将应用服务逻辑和系统服务分离,实现高内聚低耦合。
容器 — Spring负责创建和管理对象(Bean)的生命周期和配置。
MVC — 对web应用提供高度可配置型,其他框架的集成也十分方便。
事务管理 — 提供了用于事务管理的抽象层。
JDBC异常 — Spring的JDBC抽象层提供了一个异常层次结构,简化了错误处理策略。

5、 Spring Framework有多少个模块,他们分别是什么?

Spring Core: Spring其他所有功能都需要依赖该类库,主要提供IoC依赖注入功能。
Spring Aspects: 该模块为与AspectJ的继承提供支持。
Spring AOP:提供了面向切面的编程实现。
Spring JDBC: Java数据库连接。
Spring JMS:Java消息服务。
Spring ORM: 用于支持Hibernate等ORM工具。
Spring Web:为创建Web应用程序提供支持。
Spring Test: 提供了对JUnit 和TestNG测试的支持。

6、什么是Spring 配置文件?

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

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

接口。Bean类。AOP。Bean配置文件。用户程序

8、使用Spring有哪些方式?

作为第三方Web框架,使用Spring Frameworks中间层。
作为企业级Java Bean,可以包装现有的POJO。

Spring IoC

1、什么是依赖注入?

将对象交由Spring容器去进行管理,这些管理的对象就统称为Bean。就不需要像传统的做法,需要一个对象的时候,需要使用new操作,这个操作Spring容器已经帮我们完成了,我们只需要要在需要使用的类里面,直接引用Spring已经创建好的Bean对象。这就叫做依赖注入,也称为控制反转(就是从对象由我们主动创建反转为Spring容器工厂帮我们创建)。

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

3、Spring中有多少种IOC容器?

Spring IOC容器,是负责创建和管理对象(Bean)的一个工厂组件。管理各个Bean的生命周期和各个Bean的引用关系等。
BeanFactory — 包含bean集合的工厂类,它会在客户端要求实时实例化bean。
ApplicationContext — ApplicationContext接口扩展了BeanFactory接口,在BeanFactory接触上提供一些额外的功能。

4、区分BeanFactory 和 ApplicationContext?

BeanFactory提供的功能更少,同时BeanFactory对Bean的管理是延迟加载的机制,也就是只有当使用Bean的时候才会去创建,这样就会导致系统在启动的时候,无法知道在Bean创建过程中是否有问题。
ApplicationContext是由BeanFactory派生而来的,拥有BeanFactory的所有功能,并在原有的基础上丰富了功能,支持国际化(),ApplicationContext管理的Bean是在系统启动的时候就一次性加载完毕的。
BeanFactory不支持国际化,ApplicationContext支持国际化。
BeanFactory不支持基于依赖的注解,ApplicationContext支持基于依赖的注解。

5、 列举IoC的一些好处?

(1)代码上的解耦。
之前的做法,需要直接在需要使用对象的类里面直接进行new 对象的操作,这种做法其实耦合性就是有点高的,如果有多个类同时需要这个对象,就得在每个类里面都要有一个new 对象的操作,后面,假如调整了类所需的对象信息(这个对象实现的接口跟原来的旧对象实现的接口是一样的),那此时就需要修改所有类里面关于旧对象的代码,不易于维护且容易修改错误,修改不全的问题。
但是如果使用Spring IoC的话,我们可以直接将旧对象从Spring容器中管理的对象中移除,让新的对象交由Spring去管理,因为新旧对象都是实现同一个接口的,所以就可以使用接口的信息注入到所需的类里面,类似下面的书写

  1. public class Test {
  2. @Autowired
  3. private MyService myService;
  4. }
  5. //@Service -- 注释后,Spring容器就没有这个Bean对象了
  6. public OldMyServiceImpl implement MyService {
  7. ...
  8. }
  9. @Service
  10. public MyServiceImpl implement MyService {
  11. ...
  12. }

(2)Spring容器管理的对象默认是单例的,这样相比较于传统方式,创建的资源和回收的垃圾信息也相对会少。
(3)最小化应用程序的代码量,易于测试和维护。
(4)支持实时的实例化和延迟加载服务。

6、Spring IoC的实现机制?

工厂模式 + 反射机制(根据BeanDefition定义的构造函数,类信息等)去反射创建一个Bean对象。

Bean

1、 什么是Spring Bean?

交由Spring容器管理的对象就是Spring Bean。
由Spring容器实例化,配置,装配和管理。

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

注解配置
XML配置
基于JavaAPI配置 — 可以通过@Bean和@Configuration来实现。

@Bean注解扮演与元素相同的角色。
@Configuration类语序通过简单调用同一个类中的其他@Bean方法来定义bean之间的依赖关系。

3、Spring支持几种 bean scope?

singleton — 单例。每个Spring IoC容器仅有一个单实例。
prototype — 每次的请求,都会创建一个新的Bean对象引用。
request — 每次http请求就创建一个新的Bean对象引用,并且该bean仅在当前的HTTP请求中有效。
session — 每次http请求都会产生一个新的bean对象引用,同时该bean仅在当前HTTP session内有效。
global session — 全局session

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

(1)实例化Bean:加载Bean的元数据(类信息,属性类型等),然后交由BeanDefintion去定义模板,Spring容器根据BeanDefinition去实例化Bean。
(2)设置对象属性,实现依赖注入。注入方式:构造函数注入,setter方法注入,接口注入。
(3)实现Aware接口。BeanNameAware可以获取Bean的名称,ApplicationContextAware可以让Bean获取Spring容器的信息。
(4)初始化前的自定义前置操作。实现BeanPostProcessor接口,调用postProcessBeforeInitialization()方法完成前置操作。
(5)初始化。InitializingBean与init-method属性。
(6)初始化后的自定义后置操作。实现BeanPostProcessor接口,调用postProcessAfterInitialization()方法完成后置操作。
(7)销毁Bean。 DisposableBean 与 destory-method属性。

5、什么是Spring 的内部bean?

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

6、什么是Spring 装配?

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

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

  • no - 默认设置,表示没有自动装配。应使用显式bean引用进行装配。
  • byName - 根据bean名称注入对象依赖项。匹配并装配其属性与XML文件中有相同名称定义的bean。
  • byType - 根据类型注入对象的依赖项。如果属性的类型与XML文件中的一个bean名称匹配,则匹配并装配属性。
  • 构造函数 - 通过调用类的构造函数注入依赖项。有大量的参数。
  • autodetect - 首先容器尝试通过构造函数使用Autowired装配,如果不能,则尝试通过byType自动装配。

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

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

    9、Spring中单例Bean的线程安全问题了解吗?

    单例Bean的存在线程安全问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。
    常见的解决办法:

  • 在Bean对象中尽量避免定义可变的成员变量

  • 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中。

项目是否有遇到过? —之前AI助手在继承Mybatis Plus的多数据源配置的时候,曾经使用Request去获取数据源租户的名称信息,发现是获取不到的,这个也是因为bean单例线程不安全导致的。

注解

1、你用过哪些重要的Spring 注解?

@Controller — 用于Spring MVC项目中的控制器类。
@Service — 用于服务类。
@Repository — 用于Dao层。
@Component — 通用的Spring管理组件, 注解是作用在类中。
@Aspect、@Before、@Around、@After、@Pointcut — 用于面向切面编程
@Required —
@Autowired — 用于Spring bean 中自动装配依赖项
@Qualifier — 使用@Autowired注解,以避免在存在多个bean类型实例时出现混淆
@RequestMapping — 用于控制器类和控制器处理方法中配置URL映射。
@RequestBody — 参数的请求体
@RequestParam — URL请求参数
@RequestHeader — 获取请求头信息
@PathVariable — 用于将动态值从URI映射到处理程序方法的参数
@ResponseBody — 用于发送Object作为相应,通常是发送JSON数据作为响应
@RestController — @ResponseBody和@Controller的结合,通常是用于前后端分离的项目当中
@Configuration —
@ComponentScan — 定义扫描的路径信息,然后从该路径上找出标识需要装配的类自动装配到Spring容器中。
@Bean — 注解是作用在方法中。自定义更强,可以通过标注一个方法,将方法返回的对象装配到Spring容器中。
自定义注解

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

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

3、@Component、@Controller、@Service、@Repository有何区别?

@Contoller 常用于标注在控制层的对象,本质是@Component特殊表示。
@Service常用于标注在业务层的对象,本质是@Component特殊表示。
@Repository常用于标注在DAO层的对象,本质是@Component特殊表示。
@Component 是Spring管理组件的通用构造型。spring的组件扫描机制可以将其应用至应用程序的环境里。

4、@Required注解有什么用?

@Required应用于bean属性setter方法,此注解仅只是必须在配置时使用bean定义中的显示属性值或使用自动装配填充受影响 的bean属性。如果尚未填充受影响的bean属性,则容器会抛出 BeanInitializationException

  1. public class Employee {
  2. private String name;
  3. @Required
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. public String getName() {
  8. return name;
  9. }
  10. }

5、@Qualifier注解有什么用?

当你创建多个相同类型的bean并希望仅使用属性装配其中的一个bean时,可以使用@Qualifier注解和@Autowired注解来指定应该装配哪个确切的bean来消除歧义。

6、@Autowired注解有什么用?

@Autowired可以准确控制应该在何处以及如何进行自动装配。此注解可以用在setter方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配bean。默认情况 下,是类型驱动(byType)的注入。

7、@RequestMapping注解有什么用?

可以使用在控制类和控制类下的方法。
类级别 — URL映射
方法级别 — URL映射 + 请求方式(POST/GET等)

8、@Component 和 @Bean 的区别是什么?

  • 作用对象不同: @Component 注解作用于类,而 @Bean 注解作用于方法。
  • @Componet 通常是通过类路径扫描来自动侦测和自动装配到Spring容器的。 @Bean 注解通常是在我们标有该注解的方法中定义产生这个Bean, @Bean 告诉了Spring这是某个类的实例,当我们需要用它的时候就返回给我。
  • @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册bean。比如当我们引用第三方库中的类需要装配到Spring容器中时,就只能通过 @Bean 来实现。

    数据访问

    1、Spring DAO有什么用?

2、SpringJDBC API中存在哪些类?

JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall

3、列举Spring支持的事务管理类型?

程序化事务管理 — 在此过程中,在编程的过程下管理事务。提供极大的灵活性,但维护起来十分困难。
声明式事务管理 — 事务管理与业务代码分离,仅使用注解或基于XML的配置来管理事务。

4、Spring事务的隔离级别?

TransactionDefinition接口定义了五个表示隔离级别的常量

  • TransactionDefinition.ISOLATION_DEFAULT :使用后端数据库默认的隔离级别,MySQL的RR(可重复读)隔离级别。
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED :最低隔离级别,允许读取尚未提交的数据变更,可能会导致脏读,幻读和不可重复读。
  • TransactionDefinition.ISOLATION_READ_COMMITTED :允许读取并发事务已经提交的事务,可以阻止脏读,但是幻读和不可重复读仍会发生。
  • TransactionDefinition.ISOLATION_REPEATEABLE_READ :对统一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。可以阻止脏读和不可重复读,但幻读仍会发生。
  • TransactionDefinition.ISOLATION_SERIALIZABLE :最高隔离级别,完全服从ACID的隔离级别。所有的事务一次逐个执行,这样事务之间就完全不可能产生干扰。可以防止脏读,不可重复读,幻读等问题。但是因为是串行化,所以会严重影响程序的性能。

    5、Spring事务的传播行为

    支持当前事务的情况

  • TransactionDefinition.PROPAGATION_REQUIRED :如果当前存在事务,则加入该事务。如果当前不存在事务,则创建一个新的事务。

  • TransactionDefinition.PROPAGATION_SUPPORTS :如果当前存在事务,则加入该事务。如果当前不存在事务,则以非事务的方式继续执行。
  • TransactionDefinition.PROPAGATION_MANDATORY :如果当前存在事务,则加入该事务。如果当前不存在事务,则抛出异常(mandatory:强制性)

不支持当前事务的情况

  • TransactionDefinition.PROPAGATION_REQUIRES_NEW :创建一个新的事务,如果当前存在事务,就把当前事务挂起(淘汰,不使用)
  • TransactionDefinition.PROPAGATION_NOT_SUPPROTED :以非事务方式执行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER :以非事务方式执行,如果当前存在事务,则抛出异常。

其他情况

  • TransactionDefinition.PROPAGATION_NESTED :如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来执行;如果当前没有事务,则该值等价于 TransactionDefinition.PROPAGATION_REQUIRED

    6、Spring 支持哪些ORM框架?

    Hibernate
    MyBatis
    JPA

AOP

1、什么是AOP?

面向切面编程。可以将系统的业务代码和系统服务代码分离,实现代码的解耦。

2、AOP的Aspect、Advice、Pointcut、JointPoint?

Aspect — 切面,是一个实现交叉问题的类,例如事务管理。
Advice — 通知。针对特定JoinPoint采取的操作。类似Spring的拦截器(Interceptor)或Servlet过滤器(Filter)。
Advice Arguments — 可以在advice方法中传递参数。可以在切入点使用arg()表达式来应用于与参数模式匹配的任何方法。
Pointcut — 切入点。是与JoinPoint匹配的正则表达式,用于确定是否需要执行Advice。
JointPoint — 连接点。应用程序中的特定点,例如方法执行,异常处理等。在Spring AOP中,JoinPoint始终是方法的执行器。

3、什么是通知(Advice)?

特定JoinPoint处的Aspect所采取的动作成为Advice。Spring AOP使用的Advice作为拦截器,在JoinPoint周围维护一系列的拦截器。

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

  • Before — 在目标对象(未增强的对象—JointPoint)执行前执行的代码片段,可以用@Before注解进行配置。
  • AfterReturning — 在目标对象方法执行完毕并返回值后执行的代码,可以用@AfterReturning注解进行配置。
  • AfterThrowing — 在目标对象方法抛出异常后执行的代码片段,可以用@AfterThrowing注解进行配置。
  • After — 在目标对象方法执行之后执行的代码片段,可以用@After注解进行配置。
  • Around — Around类型的通知,是在目标对象之前和之后之后执行,并使用@Around注解进行配置。

    5、什么是编织(Weaving)?

    创建一个advice对象,去链接一个aspect和其他应用类型或对象,成为编织。
    将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。

    6、指出在spring aop中concern 和 cross-cutting concern的不同之处?

7、AOP有哪些实现方式?

静态代理 — 使用AOP框架提供的命令进行编译,在编译阶段生成AOP代理类,编译时增强。
动态代理(JDK动态代理,CGLIB代理) — 在运行时内存临时生成可执行的AOP代理类,运行时增强。
编译时编织(特殊编译器实现)
类加载时编织(特殊的类加载器实现)

8、Spring AOP 和 AspectJ AOP有什么区别?

Spring AOP是基于动态代理实现,AspectJ AOP是基于静态代理实现。

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

本质其实就是对现有代码的增强。
Java中有三种代理模式。
静态代理,编译时增强。
JDK动态代理,运行时增强,基于接口去实现。
CGLIB动态代理,运行时增强,基于子类实现。

MVC

1、Spring MVC框架有什么用?

代码上的分层,有助于分离应用程序的不同方面,比如输入逻辑,业务逻辑和UI逻辑,用于开发灵活且松散耦合的Web应用程序。

2、描述一下DispatcherServlet的工作流程?

1、用户向服务端发送HTTP请求,被前端控制器 DispatcherServlet 捕获。
2、 DispatcherServlet 会对请求的url进行解析,得到请求的资源标识URI,然后根据URI,调用 HandlerMapping 获得该Handler配置的相关对象(包括Handler对象以及Handler对象对应的拦截器)麻醉后以 HandlerExecutionChain 对象形式返回。
3、 DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter
4、提取Request的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据配置,Spring会做一些额外的工作:
HttpMessageConver — 将请求消息(xml,json数据)转换为一个对象,将返回对象转换为指定的响应信息。
数据转换 — 对请求消息进行数据转换,比如String 转为 Integer,Double等
数据格式化 — 对请求消息进行数据格式化,如将字符串转换为格式化数字或格式化日期等
数据验证 — 验证数据的有效性(长度,格式等)
5、Handler(Controller)执行完成后,想 DispatcherServlet 返回一个ModelAndView对象
6、根据返回的ModelAndView,选择一个 ViewResolver (视图解析器)返回给 DispatcherServlet

请求 —> DispatcherServlet(前端控制器) —> HandlerMapping(Handler 映射组件) —>HandlerExecutionChain(Handler 执行链) —> HandlerAdapter(Handler 适配器) —> 数据转换,数据校验 —> Handler执行方法 —> 结果数据返回,ViewResolver(视图解析器)解析数据 —> 返回给DispatcherServlet —> 数据展示至用户端

3、介绍一下WebApplicationContext?

WebApplicationContext是ApplicationContext的扩展。具有Web应用程序所需的一些额外功能。

4、如何格式化Spring MVC参数?

5、如何处理Spring MVC中的跨域问题?

6、Spring MVC拦截器有什么用?怎么用?

7、如何在Spring MVC中校验参数?

8、Spring MVC的流程是什么?

9、为什么选择Spring MVC?

10、Spring中用到了哪些设计模式

工厂设计模式 — Spring使用工厂模式通过 BeanFactoryApplicationContext 创建bean对象。
代理设计模式 — Spring AOP功能的实现。
单例设计模式 — Spring创建的Bean默认都是单例的。
包装器设计模式 — 我们项目需要连接多个数据库,而且不同的客户在每次访问中会去访问不同的数据库。这种设计模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式 — Spring时间驱动模型就是观察者模式很经典的一个应用。
是陪着模式 — Spring AOP的增强和通知使用了适配器模式。