Spring常见面试题及知识点总结
Java面试中常考的重点知识点就是关于Spring的技术栈知识体系。经过长时间的努力整理出的 Spring 系列知识点涵盖了从基础到进阶的核心组件与技术。这些知识点不仅包含对 Spring 基础框架的理解与应用,还包括 SpringMVC 框架的设计理念与实际应用场景,以及 Spring Boot 快速开发技术的相关内容,还深入解析了 Spring Cloud 进阶服务架构的概念与运行机制。此外,猿人还整理并提供了完整的实践学习资源包,其中包括源码分析与详细文档解析,帮助初学开发者快速掌握核心技能
访问SpringBoot/SpringCloud学习源码与文档 以获取丰富的学习资料。这个资源凝聚了猿人团队数不清的心血。欢迎各位有志之士!
1.你对Spring框架的理解,Spring框架有哪些模块?
作为一个紧凑型的依赖注入(IoC)与面向对象编程(AOP)容器框架Spring旨在为企业级应用提供基础服务一整套技术方案它的主要目标就是简化企业应用开发的过程通过这一设计原则在开发过程中开发者只需专注于业务逻辑即可
- Spring作为专门简化企业应用级开发的一个开源框架。
- 简化开发:它将常用的API进行了封装,并非逐个访问。例如,在使用Spring JDBC访问数据库时,则无需自行处理获取连接及关闭问题。
- 解耦化处理:该技术帮助我们实现了解耦化处理功能,在提升系统维护性方面发挥了重要作用。
- 集成化支持:该框架提供了良好的扩展性和可配置性,在功能扩展方面表现出色。如与Mybatis集成即可实现更多数据访问逻辑。
- 基于设计模式构建:该框架采用了成熟的体系结构设计方法论,在实际应用中能够显著提升工作效率与代码质量。
- Spring容器作为一个核心组件,在对象生命周期管理、依赖关系协调等方面发挥着关键作用。
主要包括以下七个模块:
- Spring Context:支持Bean访问接口的方式以及企业级功能(如JNDI组件、定时任务组件等);
- Spring Core:基于核心API库提供的所有功能实现IOC与DI服务;
- Spring AOP:详细讲解AOP面向切面编程的概念与实现细节;
- Spring Web:提供Web应用开发的基本特性,并支持Struts2框架的应用(框架本身将Spring资源注入至应用逻辑中);
- Spring MVC:基于MVC模式构建Web应用架构的具体实践;
- Spring DAO:对 JDBC访问异常处理机制进行封装,并实现了事务管理功能的统一管理;
- Spring ORM:对现有的ORM技术框架进行功能扩展与性能优化。

2.Spring的优点?
- 降低开发复杂度
- 解耦
- 集成其他框架
- 低侵入式设计
- 显示出减少了业务对象替换所需的复杂性
- 增强了各组件之间的独立性
- 显示出能够集中管理一些通用任务,并举例说明:如安全、事务管理和日志记录等。
- 因此使得代码能够更好地复用现有组件
3.什么是控制反转(IOC),什么是依赖注入(DI)?
- IOC:其核心思想是通过依赖注入组件(IOC)来管理对象之间的依赖关系,默认情况下这些关系是由开发者自行建立并维护的,在Spring框架中,默认情况下这些关系将由依赖注入组件负责管理并进行维护;这样一来便实现了将原本由开发者进行的操作移交给框架组件从而实现了"控制反转"这一设计理念;而BeanFactory作为Spring IOC框架中的核心接口主要用于实现对 beans 的获取与配置。
- DI:在Spring框架中当我们使用容器时它会通过注入机制直接为对象提供必要的初始化配置;具体而言当我们在编写代码时如果需要为某个对象提供特定的初始化配置只需在该对象的构造方法中调用容器提供的注入方法即可完成初始化过程。
- 目标是实现系统架构的模块化设计 而依赖注入作为一种技术手段则为我们提供了实现这一目标的有效途径。
4.Java中实现依赖注入的三种方式?
- 构造器注入
- set方法注入
- 接口注入
5.Spring容器中如何创建对象?
- 无参构造器创建对象
- 有参构造器创建对象
- 工厂类创建对象
福利
猿人归纳整理了关于Spring家族的知识要点,并涵盖了以下技术:包括但不限于 Spring框架的基本概念与工作原理以及相关的开发实践。针对核心组件如 SpringMVC 的功能特性进行了深入解析,并结合实际项目经验分享其应用场景与优化技巧。此外,并提供了丰富的实战学习资料包供开发者参考使用
SpringBoot
springboot-abstract工程
XXX工程
springboot-abstract工程
springboot-hello工程
springboot-web工程
springboot-config工程
springboot-mvc工程
springboot-mybatis工程
springboot-druid工程
springboot-json工程
springboot-log工程
抽象服务 工程
HelloWorld项目
Web应用 工程
配置管理 工程
MVC框架 工程
MyBatis应用 工程
Druid 数据源 工程
SpringCloud
- SpringCloud 实战教程 | 001篇: 服务注册与发现Eureka
- SpringCloud 实战教程 | 002篇: 服务消费者Rest+Ribbon方式
- SpringCloud 实战教程 | 003篇: 服务消费者Feign方式
- SpringCloud 实战教程 | 004篇: 断路器Hystrix
- SpringCloud 实战教程 | 005篇: 路由网关Zuul
- SpringCloud 实战教程 | 006篇: 分布式配置中心SpringCloud Config
- SpringCloud 实战教程 | 007篇: 高可用的分布式配置中心SpringCloud Config
- SpringCloud 实战教程 | 008篇: 消息总线SpringCloud Bus
- SpringCloud 实战教程 | 009篇: 服务链路追踪SpringCloud Sleuth
- SpringCloud 实战教程 | 010篇: 高可用的服务注册中心
- SpringCloud 实战教程 | 011篇: 断路器监控Hystrix Dashboard
- SpringCloud 实战教程 | 012篇: 断路器聚合监控Hystrix Turbine
点击此处访问SpringBoot/SpringCloud学习源码和文档,获取学习资料。经过长时间的努力整理而成。加油!希望所有正在努力的朋友都能有所收获!

深入学习课程内容,请点击此处访问猿码天地-Java知识学堂脑图项目地址:https://github.com/bestsoftman/-it-knowledge/tree/main/sources
6.Spring有几种配置方式?
- 基于XML文件的配置
这种类型的配置文件常见于以beans开头的形式,并采用了一系列特定的bean定义以及相关应用配置选项来进行构建。在Spring XML中,其配置方式通常是基于被Spring命名空间支持的一系列XML标签来进行实现。
- 基于注解的配置
也可以采用注解的方式来替代XML方式下的Bean元素设置。具体而言,在Spring框架中,默认支持组件扫描功能。它能够自动识别并配置与当前上下文相关的Bean对象属性。常见用于依赖注入的注解包括:@Controller、@Service、@Autowired等。这些注解不仅简化了配置流程还能提高代码的可维护性与扩展性。
- 组件扫描
容器将对base-package所指定的包及其子包中的所有类执行扫描,并且如果这些类具有某些特定注解,则会被包含在容器中进行管理。
- 在类前面添加的一些特定的注解
组件类中的通用注解包括@Component标记组件类、持久化处理中的Repository标记用于定义持久化的对象或关系以及其属性属性等信息等信息等信息等信息
7.Spring Bean的生命周期?
在Java生态系统中,Spring被视为最受欢迎且功能最为强大的轻量级框架之一。深入掌握Spring Bean生命周期的知识对于后续开发至关重要。在Spring框架中,默认情况下我们使用ApplicationContext作为应用的主要运行环境,在大多数框架中(如Hibernate),BeanFactory的功能与之相似。而对于ApplicationContext中的Bean生命周期,则是我们重点探讨的内容。而在大多数框架中(如Hibernate),BeanFactory的功能与之相似。实际上,在大多数框架中(如Hibernate),BeanFactory的功能与之相似。
概述Bean的生命周期包含四个步骤:实例化(Instantiation);属性注入(Populate);初始化(Initialization);摧毁(Destruction)。
但具体来说,Spring Bean的生命周期包含下图的流程:

(1)实例化Bean
每当客户试图获取未初始化的bean时,在请求或启动其生命周期的过程中如果需要注入一个尚未完全初始化的依赖项,则会触发createBean方法来完成实例化过程。
当ApplicationContext容器完成后,在访问BeanDefinition对象中的信息时会创建所有Bean实例。
(2)设置对象属性(依赖注入)
实例化后的对象被放置到BeanWrapper对象中;随后,在基于BeanDefinition的信息以及利用BeanWrapper提供的设置属性的接口下,Spring负责处理属性设置与依赖注入的过程。
(3)处理Aware接口
Spring会识别该对象是否遵循了xxxAware接口,并基于此提供相应的支持;
通过Aware类型的接口设计,
这样我们可以获取到Spring容器的一些资源;
①当该Bean具备实施BeanNameAware接口的能力时,则会通过其提供的setBeanName(String beanId)方法来注入表示本类名称的字符串参数;
②若该类支持实施BeanClassLoaderAware接口,则将通过setBeanClassLoader()方法来注入表示Java虚拟机加载器的类加载器对象实例;
③当该类能够实现BeanFactoryAware接口时,则会利用其提供的setBeanFactory()方法来注入本类应用框架内部使用的Spring工厂实例;
④若该类具备实施ApplicationContextAware接口的能力,则将通过setApplicationContext(ApplicationContext)的方法来注入表示应用框架运行环境的ApplicationContext对象。
(4)BeanPostProcessor前置处理
如果想对Bean进行一些自定义的前置处理,则可以让Bean遵循BeanPostProcessor接口,并会被调用postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean
当JavaBean类实现InitializedBean接口时,在初始化过程中调用afterPropertiesSet()方法。
(6)init-method
当Bean在Spring配置文件中设置init-method属性时,该属性将被触发以执行相应的初始化方法.
(7)BeanPostProcessor后置处理
当该Bean满足BeanPostProcessor接口的要求时,则会触发postProcessAfterInitialization(Object obj, String s)方法;这是因为该方法是在Bean初始化过程结束后被调用的,在这种情况下它就具备了应用于内存或缓存技术的能力;
完成上述几个步骤后, Bean已成功生成, 然后就可以利用该Bean进行操作
(8)DisposableBean
当Bean不再被使用时,进入清除阶段;如果该Bean实现了DisposableBean接口,则该实现将被调用destroy()方法。
(9)destroy-method
当某个Bean的Spring配置中设置了destroy-method属性时,相应的销毁方法将被自动触发。
8. 解释什么叫延迟加载?
默认启动时,容器会自动生成所有作用域为单例的Bean;但对于某些业务场景,我们并不希望它们在容器启动前全部预先生成,因此可以在Bean中设置lzay-init属性为"true",这样就能确保当容器启动后,作用域为单例的Bean就不会再生成了。
9. 解释什么是自动装配?
我们可以将一个JavaBean配置到另一个JavaBean的属性中进行绑定,默认情况下容器不会自动生成关联。Spring框架可以通过将JavaBean对象注入到 beanshell BeanFactory 中来实现对象间的动态绑定从而达到动态集成的目的。
10.Spring bean元素的作用域?
使用Spring容器创建Bean实例时不仅可以实现Bean对象的实际化还可以指定其所属的作用域范围以下五种作用域类型均可被Spring bean元素覆盖
- Singleton:在Spring IOC容器中仅有一个实例。
- Prototype:每次获取由prototype定义的beans时会产生新的bean实例。
- Request:每当处理一个HTTP请求数量增加时会生成新的bean实例,并且该作用域仅在Web应用环境中生效。
- Session:每当处理一个HTTP session时会生成新的instance。
- GlobSession:每一个全局HTTP session都会生成新的instance。
11.Spring框架中都用到了哪些设计模式?
- 单例模式:遵循单例原则。
- 工厂模式:通过Spring框架提供的BeanFactory和ApplicationContext等工具类来创建Bean对象。
- 模板方法模式:基于Template结尾的方法用于数据库操作。
- 代理模式:基于AOP(面向切面编程)的技术实现。
- 观察者模式:在Spring中经典的事件驱动架构正是基于观察者模式的设计。
- 适配器模式:通过适配器模式实现了对AOP增强功能的支持,在SpringMVC中则利用适配器来处理Controller相关的事宜。
- 装饰者模式:当我们的项目涉及多个数据库连接时,在每次客户端访问时根据客户需求动态选择并连接到合适的数据库资源。
重点推荐!想学习设计模式的程序员们快看过来!点击跳转至DesignPattern 设计模式学习笔记(源码+文档)的官方链接阅读!猿人耗时半个月精心整理的设计模式干货等你来领养!
12.Spring中的事件处理?
Spring体系中的核心是ApplicationContext, 它全面管理Bean对象从创建到销毁的整个生命周期
Spring 提供了以下5种标准的事件:
(1)上下文更新事件(ContextRefreshedEvent):该事件会被触发于支持ContextRefreshedEvent接口的ConfigurableApplicationContext类的refresh()方法调用中。
(2)上下文开始事件(ContextStartedEvent):此事件被触发当容器启动ConfigurableApplicationContext的Start()方法时。
(3)Container stop events, also known as ContextStoppedEvent, occur when the container invokes the Stop() method of ConfigurableApplicationContext to halt operations.
(4)上下文关闭事件(ContextClosedEvent):该事件会在ApplicationContext被关闭时被触发。当容器被关闭时,它所管理的所有单例Bean都将被销毁。
(5)请求处理事件(RequestHandledEvent):在Web应用中,已完成的HTTP请求数目会触发RequestHandledEvent事件。
如果一个Bean满足了ApplicationListener接口的要求,并且有一个ApplicationEvent被触发时,则该Bean会被系统自动通知。
13.Spring AOP(面向切面)编程的原理?
- AOP面向切面编程是一种核心理念,在软件设计中被广泛采用。这种技术的核心在于识别业务处理过程中的关键切面,并通过提取这些切面来优化代码结构和运行效率。通过这种方式可以避免冗余代码的重复编写,在不影响主业务逻辑的前提下集中管理重复功能模块(如日志记录、事务控制及权限管理等),从而提高开发效率并使代码更加简洁优雅。
- AOP的主要应用场景包括缓存管理、权限控制、数据流转、错误处理、延迟加载、跟踪记录、性能优化等多个方面;其相关概念主要包括:
- 切面(Aspect):识别业务流程的关键点
- 切入点(Pointcut):定义对业务逻辑有影响的行为
- 连接点(JoinPoint):触发特定操作的位置
- 代理(Proxy):实现行为的对象
- 通知(Advice):执行特定操作的方法
- 在Spring框架中,默认情况下使用了JDK提供的动态代理机制;而Cglib则提供了一种基于底层字节码增强技术的静态代理实现方式。
在Spring框架中的AOP实现中存在一个问题:即当调用应用程序层面方法时需要在其前后自动插入切面操作以实现切面编程这一特点被称为切面点(Join point)。切面点的概念是基于面向切面编程的思想提出的其核心思想是通过切面点将外部代理与被代理对象隔离开来以实现对被代理对象的行为控制这一机制使得Spring AOP具备了强大的动态切面功能并广泛应用于实际开发场景中
(2)切面(Aspect):抽象出的通用组件能够横切多个对象。Aspect切面相当于Pointcut切点与Advice通知的结合体,由多个Pointcut切点与Advice通知组合而成。
在Spring AOP中,切面可以在类上使用 @AspectJ 注解来实现。
(3)切点(Pointcut):切点用于定义 要对哪些Join point进行拦截。
切点划分为执行相关的方式与注解相关的类型。
执行相关的方式能够使用路径表达式来指定对哪些方法进行拦截,
例如配置为add或search。
通过特定注解标记的代码块,则属于注解相关的方式。
通知(Advice):涉及在连接点(Join Point)上执行的一系列操作行为,在系统设计中可视为额外的功能模块,在实际应用中通常用于补充或优化原有的操作流程。这些操作行为主要包含权限验证与日志记录等基础功能,并根据具体需求分为几种不同的类型:如针对连接点周围的环境进行的操作...
(5)目标对象(Target):涉及连接点的对象也被称为被通知(Advice)的对象。 因为Spring AOP通过动态代理实现了这一机制的原因在于此,因此该对象始终是一个代理对象。
(6)织入(Weaving):借助动态代理,在目标对象所采用的方法中实施相应的指导原则。
(7)引入(Introduction):增加额外的方法或字段到目标类。Spring框架支持向任意目标类添加新的接口及其实现方式。通过引入机制可以让Bean对象轻松地实现IsModified接口等特性功能。例如,在一个简单的应用程序中使用该功能可以让Bean对象轻松地实现IsModified接口等特性功能。
几个概念的关系图可以参考下图:

基于** proxy pattern 的核心机制是 aspect-oriented programming **技术的独特优势所在
(1)在Java编程中,静态代理被称为编译时增强技术,在构建AOP框架时,在编译阶段会生成特殊的代理类,并将这些切面(AspectJ)嵌入到原始的Java字节码中。当程序运行时,这些修改后的字节码会生成带有增强功能的对象。
(2)Spring框架采用动态代理机制。具体来说,在运行时阶段,在内存中临时创建一个特定于该方法的AOP代理对象。
该代理完全继承了目标类的所有功能与行为,并且在其生命周期内实现了增强的功能。
并在选定的关键点上进行了功能扩展,并自动调用原有方法以维持正常流程。
这种设计既保留了原有系统的稳定性和可维护性的同时又增强了其异步能力。
在Spring AOP框架中,默认提供了两种主要的实现途径:基于JDK的标准组件式反向 proxy(SCRP)实现以及基于CGLIB组件式反向 proxy(CCRP)的具体实现方案
JDK仅支持为接口生成代理对象,并不支持为具体类生成代理。其核心机制在于InvocationHandler接口与Proxy类的协同工作方式:通过Proxy类动态生成目标类的实际代理类型(即最终真实的代理类),该类型继承自Proxy并实现了我们定义的具体接口;每当实际对象的方法被 proxy 对象调用时,InvocationHandler 通过其invoke()方法将操作反射地应用于目标实体;这种机制不仅实现了跨切(transversal)逻辑与业务流程的有效结合,并且显著提升了系统的灵活性与可维护性
InvocationHandler 的 invoke(Object proxy, Method method, Object[] args):其中 proxy 代表最终生成的代理对象;method 是被代理目标实例所具有的某个具体方法;args 则是该特定方法的具体入参,在进行方法反射调用时会传递这些参数。在该操作执行期间使用。
当目标类未实现该接口时
(3)静态代理与动态代理的主要区别在于生成AOP代理对象的时间点不同,在性能方面来说,AspectJ的静态代理方案通常表现更为优异;不过,在具体实现过程中会依赖特定的编译器来完成相关操作,在这种情况下相对较为复杂;相比之下,则无需依赖特定的编译器来进行处理
通过IoC设计模式促进组件间的协作,并实现低耦合设计;采用AOP编程技术将分散在各层的应用功能集中为可重用的应用功能模块。
14. 解释一下代理模式(Proxy)
- 代理模式: 代理模式是指原本由我负责执行的任务转移给他人代理完成的方式。具体而言,在我的工作流程中存在这样的情况:例如生产某种产品后自行销售可能效率较低,在这种情况下可以选择将销售权委托给代理商来进行客户对接服务,并专注于核心生产环节。为了实现这一目标,在系统设计阶段需要确保有专门的本类(即核心业务类)与代理类共同协作以达成统一的接口服务需求,并在主程序中调用相关模块即可完成配置与管理操作。通常情况下本类中的业务逻辑不会发生变动,在需要扩展功能时可以通过动态地增加新的代理对象或者对现有代理类进行功能模块的更新来实现业务需求的变化。
- 代 理 模 式 可 分 为 : 静 态 代 理 (Static Proxy)具有如下特点:无需改动目标对象的功能即可实现对其功能的扩展;然而其缺点则在于必须为每一个新增的功能接口生成对应的代 理 类对象从而导致代 理 对象的数量剧增;一旦接口功能发生增减则会导致目标对象与代 理 对象都需要相应地进行功能接口维护工作。
动 态 代 理 (JDK 代 理 或 接 口 代 理)相较于静态代理的优势在于不需要让代 理 对象实现特定的功能接口;其原理是通过 JDK 提供的相关API工具动态地在内存环境中构建相应的代 理 对象;此时我们只需要指定目标对象所需实现的功能接口类型即可自动生成相应的代 理 对象。
Cglib 代 理 特点是在内存环境中创建一个子类对象从而实现对目标对象功能的扩展。 - 使用场景: 在实际开发过程中如果需要对现有代码进行修改而不想影响到其他已有的代码库时可以选择采用此方式;例如当某个类被隐藏不再直接使用时为其创建一个功能相近但不完全相同的替代类即可达到隐式调用的目的;当希望为某个特定的对象提供不同的访问权限时也可以通过创建相应的替代类来满足需求;另外减少自身代码量提高系统运行效率也是该方法的一个重要应用领域;特别是在大规模系统中频繁生成实例会占用大量资源的情况下采用此方式可以显著提升系统的性能表现。
15. Spring MVC?
组件:
- 前端控制逻辑(DispatcherServlet)
- 映射处理模块(HandlerMapping)
- 处理单元(Hander)
- 模型与视图结合体(ModelAndView)
- 视图解析模块(ViewResolver)
执行流程:

- 用户向前端控制器(DispatcherServlet)提交请求,在该控制器处会识别哪些URL能够访问服务器,并根据配置文件springmvc.xml或注解信息确定可访问的URL范围。
- 前端控制器通过查找HandlerMapping组件完成URL与Controller之间的映射关系,并将具体URL配置或注解中指定的处理类存储于map<url, handler>结构中。
- 在完成映射后,HandlerMapping组件会返回对应的Controller实例,并将其附加至相应的拦截器集合中。
- DispatcherServlet接收处理后的Controller实例后,在其适配层(HandlerAdapter)处进行交互操作,并将处理结果返回给Controller。
- Controller执行处理逻辑后会返回一个包含所需数据的ModelAndView对象给HandlerAdapter组件。
- HandlerAdapter将ModelAndView对象中的数据传递给DispatcherServlet作为最终响应。
- 前端控制器利用ViewResolver组件根据逻辑视图名解析出实际页面文件(如jsp),即从ModelAndView对象中获取视图名称并查找对应页面对象。
- 解析成功后,在DispatcherServlet处获得完整页面对象并将其返回给前端控制器。
- 视图渲染过程中将ModelAndView对象中的数据注入到Request属性空间中以实现动态内容加载。
- 通过上述步骤定位到目标页面文件后,并结合Request属性空间中的数据即可实现页面内容展示与动态交互功能。
15.Spring通知(Advice)有哪些类型?
(1)前置通知(Before Advice):在连接点(Join point)之前执行的通知。
(2)后置通知(After Advice):当连接断开的时候触发的通知(无论是在正常返回还是异常退出的情况下)。
(3)环绕通知(Around Advice):围绕特定连接点的通知是一种极具强大功能的通知机制。这种通知机制不仅可以在调用该方法前后实现自定义的行为,并且能够灵活地决定是否继续执行其所在的位置的连接点,并且还可以直接返回其自身的返回值或抛出异常来终止整个操作过程。
(4)完成连接后通知(AfterReturning Advice):当连接点正常完成后会触发的告知信息(如果连接点出现错误,则不会发送)。
(5)触发异常后的提醒(Error handling guidance):当该方法出现错误时执行提醒流程
16. BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext是Spring的两个关键接口;它们都可被视为Spring的应用程序容器。
(1)BeanFactory是Spring中最基础的一个接口,在注入式 dependency injection(IoC)体系中扮演着核心角色。它负责支撑各种Bean( beans )的设计与实现,并提供了一系列关键功能:从Bean的注册到实例化操作以及依赖注入管理到生命周期控制等环节均有所涉猎。而ApplicationContext则作为BeanFactory的一个重要延伸类,在继承原有功能的同时进一步拓展了框架级别的支持能力:除了继承自父类的所有机制外还增添了更多系统性的框架级服务
- 基于MessageSource实现国际化功能。
- 资源文件访问路径通常包括URL和本地文件(由ResourceLoader负责)。
- 通过同时加载多个配置文件实现分层管理策略。
- 实现了Bean事件监听功能。
(2)
BeanFactory采用了延迟加载的形式来注入Bean对象。这种机制意味着只有当首次调用获取实例方法(如getBean())时才会实际加载实例化该对象的行为发生。因此,在这种情况下,并不能提前发现某些潜在的Spring配置问题。具体来说,在某个特定类型的属性未被正确注入的情况下,则会在后续访问该对象时才会触发异常提示信息。
BeanFactory采用了延迟加载的形式来注入Bean对象。这种机制意味着只有当首次调用获取实例方法(如getBean())时才会实际加载实例化该对象的行为发生。因此,在这种情况下,并不能提前发现某些潜在的Spring配置问题。具体来说,在某个特定类型的属性未被正确注入的情况下,则会在后续访问该对象时才会触发异常提示信息。
②ApplicationContext即是在容器启动的时候一次性生成所有的Bean实例。当容器启动的时候,我们就可以通过这种方式发现Spring中的配置问题,从而方便检查所依赖属性是否被正确注入。
在启动后会预先加载所有单例Bean,在运行时速度较快而无需重新创建这些已建立好的实例。相较于BeanFactory而言,在内存占用方面存在不足之处:当应用程序中配置的Bean数量较多时该应用的启动速度会较慢一些。
(3)BeanFactory和ApplicationContext都提供支持 BeanPostProcessor 和 BeanFactoryPostProcessor 的使用,并且它们之间存在显著的区别:即 BeanFactory需要手动执行某个操作,则是不被ApplicationContext自动处理的。
(4)BeanFactory通常多采用编程方式构建;而ApplicationContext则主要采用声明式的方法进行创建,并且例如通过ContextLoader来实现。
17. Spring事务的实现方式和实现原理
在JavaBean中定义业务对象时所涉及的数据访问需求通常会将字段划分为不同的访问权限类别以确保数据的安全性和完整性
Spring事务的种类
Spring支持编程式事务管理和声明式事务管理两种方式:
①编程式事务管理使用TransactionTemplate。
基于AOP的技术架构设计了声明式事务管理机制
声明式的事务具有显著的优势在于它能够有效地避免将事务管理的相关代码混入到业务逻辑层面。为此,在配置文件中设定相应的事务规则或者借助@Transactional注解等方式均为实现对事务规则的有效应用提供了便利途径。这样一来不仅能够使这些交易规则得以应用至业务逻辑层面还能够有效地减少潜在的污染源。然而其局限性在于仅能应用于方法层面,在功能上无法达到编程式交易那样灵活地应用于代码块级别的需求。
Spring事务的传播机制
Spring事务的工作原理涉及多个事务同时运行时如何协调的问题。该工作原理主要依靠简单的Thread-local机制来实现,在这种情况下如果调用方法是在新线程中被调用,则该机制的效果会受到影响。因此,在设计基于Spring的事务管理方案时需要充分考虑线程隔离的影响因素
① PROPAGATION_REQUIRED:(默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务。
② PROPAGATION_REQUIRES_NEW:无论当前存不存在事务,都创建新事务进行执行。
③ PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。‘
④ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑤ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。
⑥ PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
⑦ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
Spring事务的隔离级别
① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
② ISOLATION_READ_UNCOMMITTED:读未提交,允许事务在执行过程中,读取其他事务未提交的数据。
③ ISOLATION_READ_COMMITTED:读已提交,允许事务在执行过程中,读取其他事务已经提交的数据。
④ ISOLATION_REPEATABLE_READ:可重复读,在同一个事务内,任意时刻的查询结果都是一致的。
⑤ ISOLATION_SERIALIZABLE:所有事务逐个依次执行。
18、常用的5个spring框架
Spring框架也被称为Spring框架,在软件开发领域具有重要地位。它集成了IoC(Inject of Classes)技术,并提供了丰富的功能组件如Context上下文管理与Bean生命周期控制等关键模块。此外,其他基于Spring的项目如Spring Boot同样依赖于该基础组件
2 spring boot旨在简化创建 开发与部署 spring应用程序和服务 优化了配置文件设置 采用内置 web服务器架构设计 集成了许多预设微服务组件 能够与 spring cloud框架协同部署 其核心理念在于约定优于配置 仅需少量配置即可完成基本功能 提升了应用开发效率和便捷性
3.springframework Data是一个用于数据访问与操作的集合包,默认支持多种主流的数据源类型包括:JDBC、Redis和MongoDB等多种数据库连接方式
作为一个全面的微服务架构方案,Spring Cloud整合了多种功能模块,并以Spring Boot为基础构建而成。它不仅具备分布式系统开发的优势,并且集成了一系列关键的服务治理功能。例如sleuth实现了对全链路的追踪能力;而Netflix组件集则包括了hystrix熔断器、zuul网关等众多治理组件。通过config组件实现了动态配置的能力,并且bus组件则支持使用RabbitMQ、Kafka和Activemq等消息队列工具实现事件通信。
5(Spring Security主要用于高效构建安全的应用程序和服务,其基础架构整合了Spring Boot框架及其OAuth 2.0扩展功能,能够迅速实现常见的安全模式,如SAML单点登录,SSO令牌中继以及JWT令牌交换等技术.了解OAuth 2.0权威认证流程及其JWT认证方案的具体实施方法能显著提升系统的安全性.其中,OAuth 2.0作为一种标准化的身份验证与权限管理协议,为开发者提供了完整的流程规范;而JSON Web Token(JWT)则作为一种轻量级的身份验证数据格式,广泛应用于基于OAuth 2.0的安全系统中,通过它可将身份验证信息嵌入到Token中以完成高效的认证过程.]
欢迎关注微信公众号:猿码天地

