Spring考点总结

01.Spring框架的基本理解

关键字:核心思想IOC\AOP\作用(解耦、简化),简单描述框架组成

Spring框架是一款轻量级的开发框架,核心思想是IOC(控制反转)和AOP(面向切面编程),

为Java应用程序开发提供了组件管理服务,

用于组件之间的解耦,以及简化第三方JavaEE中间件技术的使用(JMS、任务调度、缓存、ORM框架),是一个基础架构型的开发框架。

Spring框架包括:IOC容器、Validation数据校验、AOP面向切面编程、Transactions事务管理、Spring JDBC、Spring MVC框架、以及各类第三方JavaEE中间件技术集成;

02.Spring框架由哪些模块组成?

关键字:官方文档描述,由7个模块组成

Spring Framework 根据官方文档的描述,主要包括以下常用5个模块:

1、Core:核心模块 2、Testing:测试模块 3、Data Access:数据访问模块 4、Web Servlet:基于Servlet的web应用开发 5、Integration:企业级系统集成模块(不同系统之间的交互集成)

03.Spring IOC的理解

关键字:IOC名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系

IOC(Inversion of Control,中文释义:控制反转)是Spring框架的核心思想之一,主要用于解耦,IOC是指将创 创建对象的控制权转移给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建bean对象并管理各个对象之间的依赖关系。使对象之间形成松散耦合关系,实现解耦;

控制:指的是对象创建(实例化、管理)的权力

反转:控制权交给外部环境(Spring框架、IOC容器)

04.Soring IOC容器的理解

关键字:IOC容器的作用、存储形式、初始化过程

IOC通常被理解为IOC Container容器,IOC容器其实就是一个Map,key是每个bean对象的ID,Value是bean对象本身。IOC容器负责创建bean对象并管理bean的生命周期。并且根据配置好的配置文件或注解,管理IOC容器中的每个bean,以及根据bean之间的依赖关系,完成bean之间的注入。

IOC容器属于Spring Core模块,用来创建和管理Bean,默认使用单例的方式将bean存储在DefaultListableBeanFactory类的beanDefinitionMap中(一个ConcurrentHashMap类型的Map集合)。

IOC容器使用ConcurrentHashMap集合存储了BeanDefinition对象,该对象封装了Spring对一个Bean所有配置信息,包括:类名、属性、构造方法参数、依赖、是否延迟加载、是否是单例等配置信息。

05.Spring DI 的理解

关键字:名词解释

DI(Dependency Inject , 中文释义:依赖注入)是对IOC概念的不同角度的描述,是指应用程序在运行时,每一个bean对象都依赖IOC容器注入当前bean对象所需要的另外一个bean对象。(例如在MyBatis整合Spring时,SqlSessionFactoryBean依赖IOC容器注入一个DataSource数据源bean)

06.什么是Spring 的 bean

简单来说,Bean代表被IOC容器管理的对象。

我们通过配置文件或注解,告诉IOC容器帮助我们管理哪些对象。

07.将一个类声明为Bean的注解由哪些?

@Component:定义通用Bean的注解,可标注任意类为Bean。如果一个Bean不知道属于哪个层,可以使用@Component注解标注。

@Repository:定义数据访问层Bean注解

@Service:定义业务层Bean的注解

@Controller:定义控制器Bean的注解

08.@Component和@Bean的区别是什么

@Component:注解作用于类,而@Bean注解作用于方法

@Component通常是通过类路径扫描来实现自动扫描并完成装配Bean到Spring IOC容器中。

@Bean注解通常用于注解某个方法,通过@Bean注解告诉了Spring IOC容器,该方法的返回值实例是一个Bean

09.@Autowire和Resource的区别是什么

@Autowire是Spring提供的注解,@Resource是JDK提供的注解

@Autowire默认的注入方式是byType(按类型自动注入),@Resource默认注入方式为byName(按名称自动注入)。

10.Spring框架中的常见注入方式有几种

关键字:整体解释三种注入方式,分别介绍每个注入方式的细节

Spring IOC有三种注入方式:构造注入、Setter注入、属性注入

构造注入:使用构造方法注入bean

Setter注入:使用Setter方法注入bean

属性注入:使用成员变量注入bean,不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠IOC容器实现注入,不严谨。

11.Spring中常见的ApplicationContext实现类由哪些

关键字:分别介绍每种实现类或子接口

ClassPathXmlApplicationContext:根据项目类路径classpath下的配置文件加载bean;

FileSystemXmlApplicationContext:根据当前磁盘的一个绝对系统文件路径下的配置文件加载bean;

AnnotationConfigApplicationContext:根据读取到的注解加载bean;

WebApplicationContext:Web容器下按照配置文件加载bean;

12.Spring框架中的Bean的作用域

singleton:Spring只会为该bean对象创建唯一实例,Spring中的bean默认都是单例

propotype:每次获取bean,spring会创建一个新的bean实例;

request:每一次HTTP请求,Spring会创建一个新的bean实例;

session:不同的HTTP绘画,Spring会创建不同的bean实例;

13.Spring框架中的Bean的线程安全

对应prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题

对于singleton作用域的Bean,所有线程都共享一个单例状态的Bean,存在资源竞争,因此是存在线程安全问题的

解决办法:

对于singleton作用域的单例bean它的线程安全问题,常见有两种解决方法:

在bean中尽量避免定义可变的成员变量(用于保存数据的成员变量);

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

14.Spring框架中的Bean生命周期

Spring Bean的生命周期总体分四个阶段:实例化=>属性注入=>初始化=>销毁

1、实例化Bean 2、注入对象依赖的属性值或对象 3、处理各种Aware接口

4、执行BeanPostProcessor前置处理 5、执行InitializingBean初始化方法

6、执行init-method自定义初始化方法 7、执行BeanPostProcessor后置处理

以上几个步骤完成后,Bean已经被正常创建,可以正常使用这个Bean了。

8、执行DisposableBean销毁Bean 9、执行destroy-method自定义销毁方法

15、Spring 框架如何解决循环依赖

循环依赖问题是指:类与类之间的依赖关系形成了闭环,就会导致循环依赖的产生。例如A类依赖B类,B类依赖C类,而最后C类有依赖A类,这样就形成了循环依赖问题。可以通过三级缓存的方式来解决循环依赖问题

Spring 容器创建 bean 的过程中使用了三级缓存:

  1. 一级缓存(singletonObjects):存放完全初始化好的单例 bean。
  2. 二级缓存(earlySingletonObjects):存放提前曝光的单例 bean,这些 bean 还没有完全初始化好。
  3. 三级缓存(singletonFactories):存放 ObjectFactory 对象,用于在需要时创建单例 bean。

假设存在两个 bean A 和 B,A 依赖 B,B 依赖 A。当 Spring 容器创建 bean A 时:

  1. 首先,Spring 尝试从一级缓存中获取 bean A,发现不存在。
  2. 接着,开始创建 bean A 的实例,但在注入 bean A 对 bean B 的依赖时,发现需要创建 bean B。
  3. Spring 又尝试从一级缓存中获取 bean B,发现不存在,然后开始创建 bean B 的实例。
  4. 在创建 bean B 的过程中,注入 bean B 对 bean A 的依赖时,Spring 首先从一级缓存中获取 bean A,不存在;然后从二级缓存中获取,也不存在;最后从三级缓存中获取。
  5. 由于此时 bean A 还在创建过程中,但是可以通过三级缓存中的 ObjectFactory 获取一个提前曝光的 bean A(虽然还未完全初始化好),并将其放入二级缓存。
  6. bean B 继续创建过程,完成初始化后,将 bean B 放入一级缓存,并从二级缓存中移除。
  7. bean A 继续创建过程,完成初始化后,将 bean A 放入一级缓存,并从二级缓存中移除。

通过这种方式,Spring 有效地解决了循环依赖问题。需要注意的是,Spring 只能解决单例 bean 的循环依赖问题,对于原型(prototype)bean 的循环依赖是无法解决的。

16.Spring框架中有哪些注解

用于声明Bean的注解:

@Component:定义通用Bean的注解,可标注任意类为Bean。如果一个Bean不知道属于哪个层,可以使用@Component注解标注

@Repository:定义数据访问层Bean的注解

@Service:定义业务层Bean的注解

@Controller:定义控制器Bean的注解

用于注入的注解:

@Autowired:按类型自动注入

@Qualifier:按名称自动注入

用于声明配置、扫码、启用特性的注解:

@Configuration:声明配置类

@ComponentSca:组件扫描

@EnableScheduling:启用任务调度

@EnableAspectJAutoProxy:启用自动代理工厂

17.Spring框架中用到的设计模式

工厂模式:Spring使用工厂模式,通过BeanFactory或ApplicationContext来创建对象;

单例模式:Bean默认作用域为单例,按照单例设计模式进行设计实现;

策略模式:Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略;

代理模式:Spring的AOP的实现依靠动态代理(JDK的反射和CDLIB);

模板方法:Spring提供了JdbcTemplate,RedisTemplate等模板对象,将相同的操作步骤进行了封装;

适配器模式:Spring AOP的增强或通知(Advice)使用了适配器模式,Spring MVC中也用到了适配器模式适配Controller;

18.Spring框架中AOP的基本理解

关键字:AOP名词解释,AOP实现原理(动态代理)

AOP(Aspect-Oriented Programming:面试切面编程):将那些与业务无关,却为业务模块共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装抽取成一个可重用的模块,这个模块被命名为切面(Aspect),便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性;

Spring AOP基于动态代理实现:

如果被代理的对象,已经实现某个接口,则Spring AOP会使用JDK Proxy(反射),基于接口的方式,创建代理对象(JDK动态代理的核心是InvocationHandler接口和Proxy类);

如果被代理的对象,没有实现某个接口,就无法使用JDK Proxy去进行代理了,这时候Spring AOP会使用Cglib,基于继承的方式,生成一个被代理的子类来作为代理(Cglib动态代理的核心是MethodInterceptor接口和Enchancer类)

19.Spring AOP和AspectJ AOP有什么区别

关键字:增强方式的差异(运行时、编译时),实现方式的差异(动态代理、字节码操作)

Spring AOP已经集成了AspectJ,AspectJ是一个Java技术生态系统中实现AOP编程思想的独立框架;AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单更容易。

Spring AOP属于运行时增强,而AspectJ是编译时增强;

Spring AOP基于动态代理(Proxying),而AspectJ基于字节码操作(Bytecode Manpulation)

20.Spring AOP有哪些通知类型

关键字:分别介绍每种通知的实现接口,执行方式

前置通知:实现MethodBeforeAdvice接口,在目标方法调用前,执行通知;

环绕通知:实现MethodInterceptor接口,是一个包围目标方法的通知。环绕通知可以在方法调用前后完成自定义的行为。

后置通知:实现AfterReturningAdvice接口,在目标方法调用后,执行通知(如果方法抛出异常,则不执行通知)

异常通知:实现ThrowsAdvice接口,在方法抛出异常的时,执行通知;

21.Spring管理事务的方式有几种

编程式事务:在代码中硬编码(不推荐使用):通过TransactionTemplate或者TransactionManager手动管理事务,实际应用中很少使用,用于理解Spring事务管理

声明式事务:在XML配置文件或者基于注解@Transaction(推荐使用),通过AOP实现。

22.Spring事务中有哪几种事务传播行为?

1、TransactionDefinition.PROPAGATION_REQUIRED

如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。@Transactional注解默认使用的事务传播行为。

2、TransactionDefinition.PROPAGATION_REQUIRED_NEW

创建一个新的事务,如果当前存在事务,则把当前事务挂起,也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰

3、TransactionDefinition.PROPAGATION_NESTED

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

4、TransactionDefinition.PROPAGATION_MANDATORY

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:代表强制性)

5、TransactionDefinition.PROPAGATION_SUPPORTS

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

6、TransactionDefinition.PROPAGATION_NOT_SUPPORTED

以非事务的方式运行,如果当前存在事务,则把当前事务挂起

7、TransactionDefinition.PROPAGATION_NEVER

以非事务的方式运行,如果当前存在事务,则抛出异常

23.Spring事务中有哪几种隔离级别、

1、TransactionDefinition.ISOLATION_DEFAULT 默认隔离级别

使用当前数据库的默认隔离级别,MySQL默认采用的是可重复读REPEATABLE_READ隔离级别。

Oracle默认采用的是读已提交READ_COMMITTED隔离级别。

2、TransactionDefinition.ISOLATION_READ_UNCOMMITTED 读未提交

最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

3、TransactionDefinition.ISOLATION_READ_COMMITTED 读已提交

允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读仍有可能发生

4、TransactionDefinition.ISOLATION_REPEATABLE_READ 可重复读

对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍又可能发生

5、TransactionDefinition.ISOLATION_SERIALIZABLE 串行化

最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能,通常情况下也不会用到这个级别。

24.Spring事务会在什么情况下失效

1、数据库不支持事务 2、事务方法未被Spring管理 3、方法没有被public修饰

4、同一类中方法调用 5、未配置事务管理器 6、方法的事务传播类型不支持事务

7、不正确的捕获异常 8、错误的标注异常类型

25.谈谈你对SpringMVC的理解

首先,MVC模式是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将请求处理控制、业务逻辑、数据显示等流程节点分离的思想来组织编码。

所以,MVC是一种设计模式,而SpringMVC是一款基于MVC设计模式思想实现的MVC框架,属于Spring技术栈的一部分。Spring MVC可以帮助我们进行更简洁的Web层的开发,并且它天生与Spring框架集成,更利于架构的设计与搭建。

相关推荐
美美的海顿3 分钟前
spring boot 火车售票微信小程序LW
spring boot·后端·微信小程序·小程序·毕业设计
小金的学习笔记6 分钟前
隐藏指定文件/文件夹和自动提示功能消失解决方案
java·idea
Q_19284999067 分钟前
基于Spring Boot的个性化推荐外卖点餐系统
java·spring boot·后端
会说法语的猪20 分钟前
IDEA使用Alt + Enter快捷键自动接受返回值一直有final修饰的问题处理
java·ide·intellij-idea
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ29 分钟前
MyBatis执行完sql后,返回的数值代表的意思
java·开发语言
CodeClimb1 小时前
【华为OD-E卷-寻找密码 100分(python、java、c++、js、c)】
java·python·华为od
爱上语文1 小时前
宠物管理系统:Service层
java·开发语言·宠物
机器视觉知识推荐、就业指导1 小时前
C++设计模式:组合模式(公司架构案例)
c++·后端·设计模式·组合模式
解梦者1 小时前
Spring(七)Spring Cloud----Feign、Zuul和Apollo
spring·spring cloud·feign·apollo·zuul
水w1 小时前
【项目实践】SpringBoot Nacos配置管理 map数据
java·服务器·开发语言·spring boot·nacos