spring面试合集
Spring是一个开源的轻量级Java SE / Java EE开发应用框架。在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚
Spring框架可以帮我们管理对象及其依赖关系,另外还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,以及管理数据库事务,除了本身提供了一套简单的JDBC访问实现,还提供与第三方数据访问框架集成,与各种Java EE技术整合(如Java Mail、任务调度等),提供一套自己的web层框架Spring MVC。可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。
spring的aop的实现方式
AOP的实现是代理模式
动态代理的实现方式和区别
jdk动态代理和使用cglib产生代理。
一般jdk动态代理用于目标类都是基于统一的接口,cglib多用于对类的代理,这些类不需要实现统一的接口。
spring源码+原理
说到spring原理,我们就一定要提到spring的整体架构,也就是它的主要模块。
spring中创建bean的底层原理流程
1、ResourceLoader
从存储介质中加载Spring配置信息,并使用Resource
表示这个配置文件的资源;
2、BeanDefinitionReader
读取Resource
所指向的配置文件资源,然后解析配置文件。配置文件中每一个BeanDefinition
对象,并保存到BeanDefinitionRegistry
中;
3、容器扫描BeanDefinitionRegistry
中的BeanDefinition
,使用Java的反射机制自动识别出Bean工厂后处理后器(实现BeanFactoryPostProcessor接口)的Bean,然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理。主要完成以下两项工作:
1)对使用到占位符的BeanDefinition
对象进行加工处理并得到成品的BeanDefinition
对象;
2)对BeanDefinitionRegistry
中的BeanDefinition
进行扫描,通过Java反射机制找出所有属性编辑器的Bean(实现java.beans.PropertyEditor
接口的Bean),并自动将它们注册到Spring容器的属性编辑器注册表中(PropertyEditorRegistry
);
4.Spring容器从BeanDefinitionRegistry
中取出加工后的BeanDefinition
,并调用InstantiationStrategy
着手进行Bean实例化的工作;
5.在实例化Bean时,Spring容器使用BeanWrapper
对Bean进行封装,BeanWrapper
提供了很多以Java反射机制操作Bean的方法,它将结合该Bean的BeanDefinition
以及容器中属性编辑器,完成Bean属性的设置工作;
6.利用容器中注册的Bean后处理器(实现BeanPostProcessor
接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。
spring的特性
Spring IoC容器
IoC容器是实现控制反转的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。
BeanFactory是IOC容器的实际代表者,它是面向Spring本身的<getBean()>;
ApplicationContext继承了BeanFactory,它是面向框架使用者的。
spring一个bean装配的过程
Bean是由IoC容器进行加载的。
BeanDefinitonReader
读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个解析成一个 BeanDefiniton
对象,并保存到BeanDefinitonRegistry
中- 容器扫描
BeanDefinitonRegistry
中的BeanDefiniton
,调用InstantiationStrategy
进行Bean实例化的工作,使用BeanWrapper
完成Bean属性的设置工作 - 单例Bean缓存池:Spring在
DefaultSingletomBeanRegistry
类中提供一个用于缓存单实例Bean的缓存器,单实例Bean以beanName为键保存在HashMap
中
spring的事务特性
ACID
Bean与Spring容器的关系
① Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表
② 根据注册表实例化Bean,装配好Bean之间的依赖关系<反射>
③ 将Bean实例放到Spring容器中
④ 使用Bean
BeanFactory和FactoryBean
一个是Factory,也就是IoC容器或对象工厂;所有的Bean都是由BeanFactory来进行管理的。
一个是Bean。一个能产生或者修饰对象生成的工厂Bean。实现与工厂模式相似。
Aop的概念
连接点JointPoint:需要插入横切关注点的扩展点,即被拦截的点,在spring中指方法
切入点Pointcut:选择一组连接点模式,即对连接点的拦截作定义
通知Advice:拦截到连接点之后做的动作
Aop默认使用的代理技术
默认情况下,@EnableAspectAutoProxy
的proxyTargetClass
属性为false。如果业务类有实现接口,那么aop使用jdk;没有实现接口使用cglib。若属性设置为true,强制使用cglib。
在aop增强的业务类中,a方法调用b方法,怎么让b方法也被增强
@EnableAspectAutoProxy
的exposeProxy
属性设置为true,将代理对象暴露到线程中。调用时从当前线程中获取代理对象进行调用,而不是使用this。
怎么指定多个切面的执行顺序
可以在切面类加上@Order注解,value值为顺序,数字越大,优先级越低。默认是Integer最大值。也可以实现Order接口?
Aop使用场景
日志,权限验证,符号验证,输入输出验证。
自定义切面和事务注解切面怎么控制他的顺序
@EnableTransactionManagement
导入的切面优先级就是默认的,最低的。自定义的就可以指定优先级。
Aop怎么解析切面的?
在bean的生命周期过程中,createBean中还没有调用bean的构造方法之前会调用bean的后置处理器InstantiationAwareBeanPostProcessor
的postProcessBeforeInstantiation()
方法,如果还没有目标对象且需要被代理,在该后置处理器中会解析切面保存到缓存中,然后创建代理对象:
- 去容器中获取所有bean的名称,然后遍历,通过bean名称取出class对象,然后判断有没有@Aspect注解
- 如果是切面了,再根据
class.getMethod
获取方法上的注解,判断类型,建立通知对象 - 加入缓存(因为遍历很耗时)
本文来自博客园,作者:白芷呀,转载请注明原文链接:https://www.cnblogs.com/angelica-duhurica/p/11418696.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!