腾讯面试题: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的底层实现?

  1. 先通过createBeanFactory创建Bean工厂(DefaultListableBeanFactory)
  2. 开始循环创建对象,因为容器中都是单例,所以先根据getBean doGetBean来获取对象,如果找不到
  3. 就通过createBean,DoCreateBean方法以反射的方式创建对象,使用的是无参构造方法(getDeclaredConstructor 和new instance)
  4. 对象属性填充 populateBean
  5. 进行其他初始化操作initializingBean

3.描述下Bean的生命周期

  1. 实例化bean,反射的方式创建对象
  2. 填充bean的属性,populateBean,循环依赖的问题(三级缓存)
  3. 调用aware接口,对象属性invokeAwareMethod
  4. 调用beanPostProcessor 前置处理器(设置applicationContext,enviroment ,resourceLoader)
  5. 调用init-method方法,invokeInitMethod()
  6. 调用beanPostProcessor后置处理器(Spring APO就是在这里实现)
  7. 获取到完整bean对象,通过getBean获取对象
  8. 使用完成之后,销毁对象distoryMethod

4.Spring如何解决循环依赖问题?

A对象里面有个b属性,B对象里面有个a属性,闭环调用
我们都知道bean对象的创建是 先实例化,然后在初始化(属性填充)

  1. 先创建A对象,实例化A对象,但此时的b属性为空
  2. 从容器中找B 对象,如果找到了,直接复制给b属性(这时就不存在循环依赖问题)
  3. 如果找不到B对象,此时实例化B对象,填充a属性
  4. 从容器中找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后置处理器

  1. 代理对象的创建 advice,切面,切点
  2. 通jdk或者cglid方式生成代理对象
  3. 在执行方法调用的时候,执行intercept方法
  4. 根据之前定义好的通知来生成拦截器
  5. 从拦截器中一次获取每一个通知,并执行

8.Spring的事物原理?

spring的事物是由AOP来实现的,首先要生成代理对象,然后按照整套流程来执行具体的操作逻辑,要通过通知来实现核心功能,但是事物不是通过通知来实现的,而是通过一个TransactionInterceptor来实现的,然后调用invoke方法

  1. 准备工作,获取方法上的事物相关属性,根据配置属性来判断是否开启事物
  2. 当需要开启事物时,获取数据库连接,并关闭自动提交,开启事物
  3. 执行具体的sql操作
  4. 在方法执行过程中,如果报错失败了,就会通过completeTransactionAfterThrowing 来完成事物回滚操作的,具体通过doRollBack方法,拿到数据库连接进行回滚操作con.callback
  5. 如果方法执行正常,就通过commitTransactionAfterReturning来完成事物提交,通过doCommit方法实现,拿到数据库连接进行提交con.commit
  6. 事物执行完成后,需要清楚事物信息 ,cleaupTransactionInfo

9.Spring事物失效有哪些?

  • 事物注解的方法不是public
  • 类没有被Spring容器管理
  • 错误的异常捕获
  • 同一个类中事物方法调用了非事物方法
  • 事物传播配置错误
  • 回滚参数配置错误
  • 没有配置事物管理器
  • 数据库本身不支持事物
  • 没有加@EnableTransactionManagement注解

10.Spring的事物传播机制?

事物A 方法里面调用了一个事物B方法,就是事物嵌套,如果B执行是吧,A怎么办?
spring中使用@Transactional进行声明式事务


一般required,required_new,nested用的最多,这个只需要理解就行

Java面试题(六)腾讯Spring夺命7连问(灵魂拷问)相关推荐

  1. java基础-(六)-使用 Spring Initializr 创建springBoot项目

    IntelliJ IDEA 支持用户使用 Spring 项目创建向导(Spring Initializr )快速地创建一个 Spring Boot 项目,步骤如下. 1. IntelliJ IDEA ...

  2. java面试题六 float变量合法声明

  3. 吊打面试官!Spring Boot的35道灵魂拷问面试题,看看你能答对多少?

    前言 做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面试,无论多小的公司 or 项目,都要跟你扯一扯 Spring Boot,扯一扯微服务,不会?没用过? Sorry , ...

  4. 《我想进大厂》之Spring夺命连环10问

    1.说说Spring 里用到了哪些设计模式? 单例模式:Spring 中的 Bean 默认情况下都是单例的.无需多说. 工厂模式:工厂模式主要是通过 BeanFactory 和 Application ...

  5. 京东Java岗:来自面试官的夺命连环56问,你怀疑人生了吗?

    前言 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹.年复一年,年年如此. 当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会. ...

  6. 京东Java岗:来自面试官的夺命连环56问,直接当场怀疑人生~

    前言 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹.年复一年,年年如此.当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会.但 ...

  7. 面试题系列:网络篇夺命连环12问

    作者 | 前阿里技术专家 - 艾小仙 一.谈一谈你对 TCP/IP 四层模型,OSI 七层模型的理解? 为了增强通用性和兼容性,计算机网络都被设计成层次机构,每一层都遵守一定的规则. 因此有了OSI这 ...

  8. 字节跳动 Java 后端岗,三轮面试,四个小时,灵魂拷问,结局我哭了但下次还敢

    第一轮面试:1 小时 28 分钟 自我介绍 数据库索引的作用是什么? 段页式 虚拟内存 缺页中断 Major/Minor page fault 区别 TLB 作用 进程/线程和虚拟内存的关系 x86 ...

  9. 1000道最新高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构!

    每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...

最新文章

  1. 周志华:Boosting学习理论的探索 —— 一个跨越30年的故事
  2. 1080解析 芒果tv_国内主流视频平台解析下载观看
  3. python dry原则_python使用建议与技巧分享(一)
  4. 分屏显示_王者做图显示器,戴尔(DELL)U2417全面介绍
  5. JS操作DOM元素属性和方法
  6. java二叉堆_为什么二叉堆利用数组存储?
  7. C++const类型的引用参数
  8. Redis分布式锁原理解析
  9. android添加时间,添加加载时间记录函数
  10. 复函数图像怎么画_...1等等.只需大致图象,和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学-禄凡闷同学...
  11. SpringCloud(一)系统架构演进
  12. 进程、地址空间、文件、I/O、保护、虚拟内存
  13. mysql自动断开该连接解决方案
  14. 【漏洞复现】内网实战-Sunlogin RCE 向日葵远程代码执行
  15. 知网显示html,使用知网HTML阅读的正确姿势
  16. 四旋翼无人机飞行器基本知识(四旋翼无人机结构和原理+四轴飞行diy全套入门教程)
  17. linux中如何从txt转为nc文件,【转】linux下nc的使用
  18. 学习笔记 | Inverting Gradients--How easy is it to break privacy in federated learning
  19. app能不能跳转外部h5_uni-app微信小程序跳转外部H5链接
  20. 应届大学毕业生户口迁移须知

热门文章

  1. 互联网金融四大暴富机会:P2P 征信 支付 供应链金融
  2. 中山纪念中学2015年暑假集训总结
  3. C13-COBOL 文件处理动词
  4. 有个疑问--RTOS系统中,低优先级任务什么时候得到cpu去运行
  5. STM32——NFC门禁模块(RC522)
  6. 玩一玩Greasemonkey--开发上手篇
  7. RabbitMQ集群搭建(七)
  8. 工信部:禁止外资参与网络出版 外国游戏国内要玩完
  9. 电脑水冷风扇转速太高怎么调?
  10. 想和应用宝sig签名谈谈