Java面试题(六)腾讯Spring夺命7连问(灵魂拷问)
腾讯面试题:Spring
- 1.谈一谈spring IOC的理解,原理与实现?
- 2.谈一谈Spring IOC的底层实现?
- 3.描述下Bean的生命周期
- 4.Spring如何解决循环依赖问题?
- 5.BeanFactory 和FactoryBean有什么区别?
- 6.Spring 中用到哪些设计模式?
- 7.Spring的AOP底层实现原理?
- 8.Spring的事物原理?
- 9.Spring事物失效有哪些?
- 10.Spring的事物传播机制?
1.谈一谈spring IOC的理解,原理与实现?
- 控制反转:以前的对象是由使用者自己创建并控制的,而有了Spring后,把整个对象都交给Spring管理
- DI:依赖注入,把对象对应的属性注入到具体的对象中,例如@Autowired
- 容器:存储对象,是使用map结果存储,3级缓存,singletonObjects存放的是完整的bean对象。整个bean的生命周期,从创建,使用,销毁的全部过程都由容器管理
原理实现
- 容器的创建(beanFactory,DefaultListableBeanFactory)
- 向bean工厂设置参数等属性(BeanPostProcessor,Aware接口)
- 加载解析bean对象,准备要创建的bean对象的定义对象beanDefinition(xml或者注解的解析过程)
- beanFactoryPostProcessor的扩展处理
- BeanPostProcessor的注册,方便后续对bean的扩展
- 通过反射的方式把BeanDefinition实例化具体的bean对象
- bean对象的初始化(填充属性,调用aware子类方法,调用前置处理器(applicationContext,resourceLoader)initMethod方法,以及后置处理器(AOP))
- bean对象初始化完成,getBean方法可以直接获取
- bean对象使用完成,销毁对象
2.谈一谈Spring IOC的底层实现?
- 先通过createBeanFactory创建Bean工厂(DefaultListableBeanFactory)
- 开始循环创建对象,因为容器中都是单例,所以先根据getBean doGetBean来获取对象,如果找不到
- 就通过createBean,DoCreateBean方法以反射的方式创建对象,使用的是无参构造方法(getDeclaredConstructor 和new instance)
- 对象属性填充 populateBean
- 进行其他初始化操作initializingBean
3.描述下Bean的生命周期
- 实例化bean,反射的方式创建对象
- 填充bean的属性,populateBean,循环依赖的问题(三级缓存)
- 调用aware接口,对象属性invokeAwareMethod
- 调用beanPostProcessor 前置处理器(设置applicationContext,enviroment ,resourceLoader)
- 调用init-method方法,invokeInitMethod()
- 调用beanPostProcessor后置处理器(Spring APO就是在这里实现)
- 获取到完整bean对象,通过getBean获取对象
- 使用完成之后,销毁对象distoryMethod
4.Spring如何解决循环依赖问题?
A对象里面有个b属性,B对象里面有个a属性,闭环调用
我们都知道bean对象的创建是 先实例化,然后在初始化(属性填充)
- 先创建A对象,实例化A对象,但此时的b属性为空
- 从容器中找B 对象,如果找到了,直接复制给b属性(这时就不存在循环依赖问题)
- 如果找不到B对象,此时实例化B对象,填充a属性
- 从容器中找A对象,此时A对象是存在的,只不过是不是完整状态,意思就是只完成实例化,未完成初始化的一个对象,这是就造成的闭环,那么怎么解决这个问题呢?
当所有对象都完成实例化和初始化操作后,容器中就有2个状态的对象,一个是完整对象,一个是完成实例化但未完成初始化 的对象,此时就需要2个map来存储,也就是一级缓存和二级缓存,一个是成品,一个是半成品
那么为什么有三级缓存?
三级缓存的value类型是ObjectFactory是一个函数式接口,是保证整个容器中的bean对象有且仅有1个
如果一个对象需要被代理,那么肯定是要先生成普通对象,然后再生成代理对象的,这样的话就有2个一样的对象的,这里就需要另外一个map来存放代理对象,但是在实例调用过程中,是不知道这个对象到底需不需要被代理,那么怎么办?此时可以用回调机制,在创建对象的时候先判断这个对象是否需要被代理,如果需要代理,就从三级缓存获取代理对象,如果不需要,就直接从一级缓存里面获取普通对象,然后把二级和三级删除
5.BeanFactory 和FactoryBean有什么区别?
- 相同点:都是用来创建bean对象的
- 不同点:使用beanFactory必须要遵循完整的生命周期流程 来创建对象,太复杂麻烦了,如果想要简单点,想自定义创建对象,就可以使用factoryBean来创建,他里面有3个方法
- isSingleTon:是否单例对象
- getObjectType:获取返回对象类型
- getObject:自定义创建对象(new,代理,反射等等方式都可以)
6.Spring 中用到哪些设计模式?
- 单例模式:bean都是单例的
- 工厂模式:beanFactory
- 原型模式:作用域protoType
- 模板模式:父类提供一个模板方法,具体实现交给子类Template
- 代理模式:AOP动态代理Proxy
- 观察者模式:事件监听对象Listener event
- 策略模式:就是比较器,就是封装if else 等逻辑判断
- 适配器模式:Adapter
7.Spring的AOP底层实现原理?
AOP实际上是IOC的一个扩展功能,现有IOC然后才有AOP,在IOC实现中,有个BeanPostProcessor后置处理器
- 代理对象的创建 advice,切面,切点
- 通jdk或者cglid方式生成代理对象
- 在执行方法调用的时候,执行intercept方法
- 根据之前定义好的通知来生成拦截器
- 从拦截器中一次获取每一个通知,并执行
8.Spring的事物原理?
spring的事物是由AOP来实现的,首先要生成代理对象,然后按照整套流程来执行具体的操作逻辑,要通过通知来实现核心功能,但是事物不是通过通知来实现的,而是通过一个TransactionInterceptor来实现的,然后调用invoke方法
- 准备工作,获取方法上的事物相关属性,根据配置属性来判断是否开启事物
- 当需要开启事物时,获取数据库连接,并关闭自动提交,开启事物
- 执行具体的sql操作
- 在方法执行过程中,如果报错失败了,就会通过completeTransactionAfterThrowing 来完成事物回滚操作的,具体通过doRollBack方法,拿到数据库连接进行回滚操作con.callback
- 如果方法执行正常,就通过commitTransactionAfterReturning来完成事物提交,通过doCommit方法实现,拿到数据库连接进行提交con.commit
- 事物执行完成后,需要清楚事物信息 ,cleaupTransactionInfo
9.Spring事物失效有哪些?
- 事物注解的方法不是public
- 类没有被Spring容器管理
- 错误的异常捕获
- 同一个类中事物方法调用了非事物方法
- 事物传播配置错误
- 回滚参数配置错误
- 没有配置事物管理器
- 数据库本身不支持事物
- 没有加@EnableTransactionManagement注解
10.Spring的事物传播机制?
事物A 方法里面调用了一个事物B方法,就是事物嵌套,如果B执行是吧,A怎么办?
spring中使用@Transactional进行声明式事务
一般required,required_new,nested用的最多,这个只需要理解就行
Java面试题(六)腾讯Spring夺命7连问(灵魂拷问)相关推荐
- java基础-(六)-使用 Spring Initializr 创建springBoot项目
IntelliJ IDEA 支持用户使用 Spring 项目创建向导(Spring Initializr )快速地创建一个 Spring Boot 项目,步骤如下. 1. IntelliJ IDEA ...
- java面试题六 float变量合法声明
- 吊打面试官!Spring Boot的35道灵魂拷问面试题,看看你能答对多少?
前言 做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面试,无论多小的公司 or 项目,都要跟你扯一扯 Spring Boot,扯一扯微服务,不会?没用过? Sorry , ...
- 《我想进大厂》之Spring夺命连环10问
1.说说Spring 里用到了哪些设计模式? 单例模式:Spring 中的 Bean 默认情况下都是单例的.无需多说. 工厂模式:工厂模式主要是通过 BeanFactory 和 Application ...
- 京东Java岗:来自面试官的夺命连环56问,你怀疑人生了吗?
前言 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹.年复一年,年年如此. 当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会. ...
- 京东Java岗:来自面试官的夺命连环56问,直接当场怀疑人生~
前言 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹.年复一年,年年如此.当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会.但 ...
- 面试题系列:网络篇夺命连环12问
作者 | 前阿里技术专家 - 艾小仙 一.谈一谈你对 TCP/IP 四层模型,OSI 七层模型的理解? 为了增强通用性和兼容性,计算机网络都被设计成层次机构,每一层都遵守一定的规则. 因此有了OSI这 ...
- 字节跳动 Java 后端岗,三轮面试,四个小时,灵魂拷问,结局我哭了但下次还敢
第一轮面试:1 小时 28 分钟 自我介绍 数据库索引的作用是什么? 段页式 虚拟内存 缺页中断 Major/Minor page fault 区别 TLB 作用 进程/线程和虚拟内存的关系 x86 ...
- 1000道最新高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构!
每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...
最新文章
- 周志华:Boosting学习理论的探索 —— 一个跨越30年的故事
- 1080解析 芒果tv_国内主流视频平台解析下载观看
- python dry原则_python使用建议与技巧分享(一)
- 分屏显示_王者做图显示器,戴尔(DELL)U2417全面介绍
- JS操作DOM元素属性和方法
- java二叉堆_为什么二叉堆利用数组存储?
- C++const类型的引用参数
- Redis分布式锁原理解析
- android添加时间,添加加载时间记录函数
- 复函数图像怎么画_...1等等.只需大致图象,和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学-禄凡闷同学...
- SpringCloud(一)系统架构演进
- 进程、地址空间、文件、I/O、保护、虚拟内存
- mysql自动断开该连接解决方案
- 【漏洞复现】内网实战-Sunlogin RCE 向日葵远程代码执行
- 知网显示html,使用知网HTML阅读的正确姿势
- 四旋翼无人机飞行器基本知识(四旋翼无人机结构和原理+四轴飞行diy全套入门教程)
- linux中如何从txt转为nc文件,【转】linux下nc的使用
- 学习笔记 | Inverting Gradients--How easy is it to break privacy in federated learning
- app能不能跳转外部h5_uni-app微信小程序跳转外部H5链接
- 应届大学毕业生户口迁移须知