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:存在事务,支持当前事务,没有事务抛异常

你可能感兴趣的:(spring-面试题)