hazy的面试小笔记之Spring(持续更新)
最近准备面试,所以会收集一些不懂得题目然后进行答案的搜索,以下答案基本都是来自网络,然后进行了一点删减和自己的总结,如果有侵权,请评论或者私信联系我,我马上删除
Spring 的七种事务传播
Spring的单例是怎么实现的?(单例注册表)
答:维护一个单例注册表,即HashMap,key为beanName, value为对应的bean,如果每次查找的都是同一个beanName,就返回同一个bean
如果是多例模式,则每次都生成新的bean并且不注册到单例注册表中
如果是单例模式,在第一次加载bean的时候锁住表并将bean添加到单例注册表中
Spring循环依赖的解决方法
答:如果是构造器的依赖循环,则无法解决
如果是field的依赖循环,spring通过三级缓存进行解决。
举例:“A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象”这种循环依赖的情况。
1、A首先完成了初始化的第一步,并且将自己提前曝光到singletonFactories中,此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,就去找B
2、接下来轮到B初始化,B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),尝试一级缓存singletonObjects(肯定没有,因为A还没初始化完全),尝试二级缓存earlySingletonObjects(也没有),尝试三级缓存singletonFactories,由于A通过ObjectFactory将自己提前曝光了,所以B能够通过ObjectFactory.getObject拿到A对象(虽然A还没有初始化完全,但是总比没有好呀),B拿到A对象后顺利完成了初始化阶段1、2、3,完全初始化之后将自己放入到一级缓存singletonObjects中。
3、此时返回A中,A此时能拿到B的对象顺利完成自己的初始化阶段2、3,最终A也完成了初始化,进去了一级缓存singletonObjects中,4、而且更加幸运的是,由于B拿到了A的对象引用,所以B现在hold住的A对象完成了初始化。
5、因为是需要初始化对象,需要一个无参构造器,所以构造器的循环就不能解决。如果使用了dependon注解也可能造成依赖循环
SpringBean的生命周期
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
影响多个Bean的接口: 1、InstantiationAwareBeanPostProcessor:包裹bean的实例化即构造函数前后
2、BeanPostProcessor:在bean的init方法前后
InstantiationAwareBeanPostProcessor的before方法是在实例化bean之前,因此可以利用它来生成代理类,取代原本的类,来达到AOP的实现,并且在这个方法中会获取所有需要被代理的类,有需要立刻代理的就马上代理(有targetSource的情况下),否则都留到初始化时再进行代理;after方法可以阻断后续的赋值操作
BeanPostProcessor中的after方法就进行了aop执行
只调用一次的接口:1、Aware类型的接口 2、生命周期接口;都是需要bean去实现这个接口的
- Aware类型的接口在bean初始化前(比beanPostProcessor还要再前)生效,可以拿到bean的一些信息比如beanName等等
- 生命周期接口则对应了init方法和destory方法
SpringBoot的启动流程
答:@SpringBootApplication包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
- @SpringBootConfiguration:读取配置文件作为一个上下文的环境,继承了普通的Configuration接口
- @EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置
- @ComponentScan:扫描同级目录下的所有组件
1、当我们运行SpringApplication的main方法时,调用静态方法run()首先是实例化,SpringApplication初始化的时候主要做主要做三件事:
- 根据classpath下是否存在(ConfigurableWebApplicationContext)判断是否要启动一个web applicationContext。
- SpringFactoriesInstances加载classpath下所有可用的ApplicationContextInitializer
- SpringFactoriesInstances加载classpath下所有可用的ApplicationListener
- 所谓的监听器模式,就是获得所有的监听器,遍历它们并把参数传给它们进行处理,而广播就是这个遍历的触发者
2、SpringApplication实例化完成并且完成配置后调用run()方法,首先遍历初始化过程中加载的SpringApplicationRunListeners,然后调用starting(),开始监听springApplication的启动。
3、加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment。将配置环境(Environment)加入到监听器对象中(SpringApplicationRunListeners)。
4、banner属性的设置
5、ConfigurableApplicationContext(应用配置上下文)创建,根据webEnvironment是否是web环境创建默认的contextClass
,AnnotationConfigEmbeddedWebApplicationContext(通过扫描所有注解类来加载bean)和ConfigurableWebApplicationContext),最后通过BeanUtils实例化上下文对象,并返回
6、 prepareContext()方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联。
7 、refreshContext(context),bean的实例化完成IoC容器可用的最后一道工序
8、 最后springboot做一些收尾工作
SpringBoot的自动装配原理
答:@SpringBootApplication->@EnableAutoConfiguration->@Import(AutoConfigurationImportSelector.class)->springboot的自动装配就是通过自定义实现ImportSelector接口,从而导致项目启动时会自动将所有项目META-INF/spring.factories路径下的配置类注入到spring容器中,从而实现了自动装配。
SpringAOP的实现原理
答:在Bean实例化之后马上执行的方法中生成一个代理类代替原先的类进行返回,这个代理类就是AOP切入之后的类
1、Spring默认使用JDK的动态代理实现AOP,类如果实现了接口,Spring就会使用这种方式实现动态代理。传入的参数应该是被代理类实例。生成的代理类父类是Proxy
2、如果被代理类没有实现接口,那么就要使用cglib代理模式,从字节码层面去生成子类。因此,被代理的类的方法不能是final的,就相当于自动帮我们写了一个子类。传入的参数应该是被代理类.class。生成的代理类父类是被代理类
在spring中,这个AOP的实现是在deCreateBean的末尾实现的,即实例化之后
BeanFactory和FactoryBean的区别
答:BeanFactory是一个工厂类、IOC容器或对象工厂,用于生成bean实例。而FactoryBean是一个特殊的bean,类似于代理类。
BeanFactory是ApplicationContext等具体的容器的接口,实现这个接口的类需要实现getBean(String beanName)返回bean实例。
FactoryBean是一个特殊的bean,当容器试图去获取这个bean的时候,返回的是FactoryBean内部getObject()方法返回的对象,通过这种方法我们可以在getObject方法返回之前添加一些额外的功能,比如代理等等.
比如我们定义了一个FactoryBean:fBean并且object引用了另一个bean:refedBean,则我们在通过容器去获取到fBean时,返回的是refedBean
可以搭配实现InitializingBean等接口使用,在object获取到引用的bean之后,生成一个bean代理类替换object
SpingIOC注入对象过程?
答:Spring最重要的功能就是IOC控制翻转,它主要是生成一个容器来存储和管理Bean。为了注入对象我们首先得有这个容器,把bean都进行注册,并且能从这个容器中取出bean。
1、使用ResourceLoader进行xml配置文件的加载并且接下来进行解析,如果是以注解的方式则需要扫描一下对应的包
2、创建beanFactory工厂类,以便后续从中取出bean。
3、生成对应的BeanDefinition,包含了bean的类信息与依赖信息等等。然后进行bean的初始化
4、注册Bean
hazy的面试小笔记之Spring(持续更新)相关推荐
- Vue -- 指令【学习笔记】(持续更新)
Vue – 指令[学习笔记](持续更新) 记录了Vue第三天的学习笔记 v-show 注意,v-show 不支持 <template> 元素,也不支持 v-else. 带有 v-show ...
- 尚硅谷(李立超)——HTML5CSS3笔记总结【持续更新】
尚硅谷(李立超)--HTML5&CSS3笔记总结[持续更新] 本文适合前端菜鸟食用,小编自己整理的李立超老师视频的笔记,手打不易,那就望您每年快乐吧.逃) 一.进制 1.十进制(日常使用): ...
- 前端(js/css/html)那些小的知识点,持续更新......
前端(js/css/html)那些小的知识点,持续更新...... 1.行内元素与块级元素有哪些及区别? 块级元素和行内元素的区别是,块级元素会占一行显示,而行内元素可以在一行并排显示.通过样式控制, ...
- 全部文章分类与整理(找工作+面试+资源分享),持续更新
阅读本文大概需要 6 分钟 由于本公众号发表的文章有点多,并且发的文章也不是一个专题一个专题这样发的,所以难免有读者过来找我吐槽说,想搜索历史的文章,不太方便. 鉴于此,为了大家阅读文章方便,我整理了 ...
- 2019最新Web前端经典面试试题及答案,持续更新
Ps: 文章所述内容,来源渠道平时积累以及网上摘录.按日期持续更新...目录: 转载请注明来源. -2018/6/8 1.position的定位方式 2.描述下从输入URL到整个网页加载完毕及显示 ...
- 最实用的微信小程序大全,持续更新中...
最全的小程序开发教程,点击下载掘金App. 小程序上线 1月9日,张小龙没有食言,微信小程序如约而至.凌晨刚过,我们便在微信发现页看到了小程序的入口. 微信发现页 之后的一个小时里,每个微信群都在疯狂 ...
- AutoCAD2019+vs2019+C# 二次开发学习笔记day01(持续更新)
目录 一.新建项目 1.应用程序 目标框架 选择 4.7.2版 2.生成 目标平台选择x64 3.调试 启动外部程序 选择 acad.exe 二.添加autocad类库 三.如何运用命名空间 1.[C ...
- Python学习笔记编程小哥令狐~持续更新、、、
Python学习笔记~编程小哥令狐 文章目录 Python学习笔记~编程小哥令狐 一.Python运行发生情况 二.变量 2.1变量引入前说明 2.2变量的命名和使用 2.3字符串 2.3.1使用方法 ...
- 2022作为面试官的我(持续更新...)
Java 1.如何临时暂停正在运行的程序[考察,wait().await().sleep().yield.join对比.区别] 拓展: 为什么java wait/notify 必须与synchroni ...
- 2020年 近期出去面试Java的总结(持续更新)
近期出去面试Java的总结 一.Java基础 1.Java的类加载顺序 对于有继承关系的加载顺序 2.Java的创建对象的几种方式 1.使用new关键字 2.使用反射机制 1)使用Class类的new ...
最新文章
- UBUNTU安装SSH和xrdp
- ThreadPoolExecutor使用介绍
- Omi应用md2site发布-markdown转网站利器
- 二级c语言努力学可以过吗,考过计算机二级C语言一些感想和建议
- 工程布线时必须注意的问题
- HTML5 API详解(1):fullscreen全屏模式
- pyqt5 判断lineedit是否为空_是否注意过 isEmpty 和 isBlank 区别?
- mysql 插入数据后返回当前的自增ID方法
- Python 带界面的可执行程序
- python压缩文件_Python压缩及解压文件
- QCIF、CIF、DCIF、D1分辨率是多少
- 文本分割器TXTSpliter
- xposed绕过模拟器检测_绝地求生刺激战场怎么避开模拟器检测?避开模拟器检测方法分享...
- 这就是2020:全球云计算十一大年度话题盘点
- 生活中的一些常用理论
- 【百度地图】——百度地图API获取经纬度、地址及周边兴趣点
- SVA 断言翻译笔记 16.13多时钟序列语法(九)
- 招商证券携手联想Filez谱写云中办公新篇章
- GitHub上Stars最多的10个Python项目
- 【焕新升级】百度大脑EasyMonitor视频监控开发平台2.0
热门文章
- 一年级上册知识点——语文(人教版)
- 张桂梅PK清华副教授:不要站在高楼上,傲慢地指着大山
- 倒水问题python实现
- C#二次开发CAD常用的方法和注意事项
- qml 中英文虚拟键盘
- 微信公众号刷票思路 Python
- Reliance Jio 4G网速最快 超过沃达丰及Idea
- macbook卡在进度条开不了机_Mac电脑开机一直卡在加载进度条怎么办?
- 湖南工大计算机学院大一分班,不懈奋斗,书写无悔青春 --中国矿业大学计算机学院14-05班获评校级“优良学分班”称号...
- k均值的损失函数_常用的损失函数