spring-面试题

面试官问到你熟悉的地方,尽量拖时间。问得越多露馅概率越大
总分模式讲

1.谈谈你对spring IOC的理解,原理和实现

总:
控制反转:理论思想,原来的对象是由使用者控制,有了spring之后,可以把整个对象交给spring管理。
spring容器:存储对象,使用map结构来存储,在spring一般存在三级缓存,singletonObjects存放完整的bean对象。整个bean的生命周期,从创建到销毁的过程全部由容器来管理(bean生命周期)
分:
1.一般聊ioc容器,需要说创建过程(beanFactory,DefaultListableBeanFactory),向bean工厂设置一些参数(BeanPostProcessor,Aware接口)
2.加载解析bean对象,准备要创建的bean对象的定义对象beanDefinition(xml)
3.beanFactoryPostProcessor处理,扩展点,PlaceHolderConfigureSupport

  1. beanPostProcessor的注册功能,方便后续对bean完成具体的扩展功能
    5.通过反射讲BeanDefinition对象实例化成具体的bean对象
    6.bean初始化过程(填充熟悉,调用aware子类方法,调用beanPostProcessor前置处理方法,调用init-method,调用beanPostProcess后置方法)
  2. 生成完整的bean对象,通过getBean方法可以直接获取
    8.销毁
    如果没看过源码:
    具体细节记不清,bean都是反射生成的,同时有很多扩展点,beanFactory扩展,bean扩展。ioc最核心的是bean属性填充和bean生命周期管理

2.spring IOC的底层实现

总:反射
设计模式
关键方法(createBeanFactory,getBean,doGetBean,createBean,createBeanInstance,populateBean,initializingBean)
分:
1.通过createBeanFactory创建一个bean工厂
2.开始循环创建对象,先查找(getBean),查不到反射创建(createBean),使用无参构造函数创建
3.进行对象信息填充(populateBean)
4.进行其他初始化动作(initializingBean)

3. bean的生命周期

1.实例化bean:反射的方式生成bean
2.填充bean的属性:populateBean,循环依赖问题(三级缓存)
3.调用aware接口相关方法,invokeAwareMethod(完成beanName,BeanFactory对象的属性设置)
4.调用BeanPostProcessor中的前置方法,使用较多的又ApplicationContextPostProcessor,设置ApplicationContext,Environment,ResourceLoader对象
5.调用initmethod方法,invokeInitmethod(调用afterPropertiesSet方法)
6.调用BeanPostProcessor的后置方法,spring的aop在此实现,AbstractAutoProxyCreator
7.获取完成对象,可以通过getBean获取对象
8.销毁流程,判断是否实现了dispoableBean接口,调用destoryBean方法

4.spring循环依赖如何解决

关键词:三级缓存,提前暴露对象,aop
总:什么是循环依赖
分:先说明bean的创建过程:实例化,初始化(填充熟悉)
1.创建A,实例化A,此时发现A对象的b为空
2.容器查找B,没有找到,直接创建B对象
3.实例化B对象,此时B对象中的a属性为空,填充属性a
4.从容器中查找A,找不到,直接创建,于是形成了循环依赖
解决:提前暴露A,将A实例化之后暴露出去(即使不完整),这样第4步找得到A。这样就存在2个A,一个是实例化后,一个是完整的初始化后。需要2个map来存,一级缓存存完整对象,二级缓存存实例化后的对象。
为什么有三级缓存,三级缓存value存的是objectFactory函数式接口,意义是保证容器运行过程同名的bean只有一个。aop代理类需要先生成原始类,最开始放三级缓存,确认类是代理类还是普通类,加入二级缓存,同时删除三级缓存。生成完整bean对象放入一级缓存,删除二三级缓存

5.bean factory和factory bean有什么区别

都是创建对象
不同点:使用beanFactory创建流程太复杂。简单自定义某个对象的创建,同时创建后交给spring管理,事项factoryBean接口

6.spring中的设计模式

单例模式:bean默认都是单例
模板方法:postProcessorFactory, onRefresh,initPropertyValue
工厂方法:beanFactory
策略模式:xmlBeanDefinitionReader,propertiesBeanDefinitionReader
观察者模式:listener,event
适配器模式:adapter
装饰者模式:beanWrapper
责任链模式:aop的时候生成一个拦截器链

7.spring AOP的底层实现

aop是ioc的扩展功能。现有ioc,再有aop,只是ioc的整个流程中新增一个扩展点:beanPostProcessor
1.代理对象创建过程(advice,切面,切点)
2.通过jdk或cglib创建代理对象
3.在执行方法的时候,调用到字节码中,找到DynamicAdvisoredInterceptor的intercept方法,从此方法执行
4.根据之前定义的通知生成拦截链,从拦截链一次获取每一个通知开始执行。

8.spring的事务如何回滚的

其实想问的是:spring的事务管理是如何实现的
总:spring的事务是由aop实现的,事务是通过transactionInterceptor来实现的
分:
1.准备工作,解析各个方法的事务相关属性,决定是否开启事务
2.开启事务,获取数据库连接
3.执行sql
4.执行失败,通过completeTransactionAfterThrowing完成回滚
5.执行成功,通过commitTransactionAfterReturning完成事务提交
6.事务执行完毕,清除事务相关属性cleanupTransactionInfo

9. 谈一谈spring事务传播

7种:
required:需要在事务中运行,如果没有事务开启一个,如果有在原有事务运行
requires_new:开启一个新事务
nested:如果一个事务存在,运行在一个嵌套事务中,外层事务是不会引起内层事务的回滚,内层事务的失败不会引起外层事务的回滚。如果没有事务,开启事务
support:有事务在事务中运行,没有就不开启事务运行
not_support:不在事务中运行,如果有事务先挂起
never:不在事务中运行,如果有事务报错
mandatory:存在事务,支持当前事务,没有事务抛异常

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容