当前位置: 首页 > news >正文

每日五道java面试题之spring篇(三)

在这里插入图片描述

目录:

  • 第一题 ApplicationContext和BeanFactory有什么区别?
  • 第二题 Spring中的事务是如何实现的?
  • 第三题 Spring中什么时候@Transactional会失效?
  • 第四题 Spring容器启动流程是怎样的?
  • 第五题 Spring Boot、Spring MVC 和 Spring 有什么区别?

第一题 ApplicationContext和BeanFactory有什么区别?

BeanFactory是Spring中⾮常核⼼的组件,表示Bean⼯⼚,可以⽣成Bean,维护Bean,⽽ApplicationContext继承了BeanFactory,所以ApplicationContext拥有BeanFactory所有的特点,也是⼀个Bean⼯⼚,但是ApplicationContext除开继承了BeanFactory之外,还继承了诸如EnvironmentCapable、MessageSource、ApplicationEventPublisher等接⼝,从⽽ApplicationContext还有获取系统环境变量、国际化、事件发布等功能,这是BeanFactory所不具备的

第二题 Spring中的事务是如何实现的?

  1. Spring事务底层是基于数据库事务和AOP机制的
  2. ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
  3. 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
  4. 如果加了,那么则利⽤事务管理器创建⼀个数据库连接
  5. 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮
    常重要的⼀步
  6. 然后执⾏当前⽅法,⽅法中会执⾏sql
  7. 执⾏完当前⽅法后,如果没有出现异常就直接提交事务
  8. 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
  9. Spring事务的隔离级别对应的就是数据库的隔离级别
  10. Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的
  11. Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,如果传播机制配置为
    需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql

第三题 Spring中什么时候@Transactional会失效?

因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时,
那么这个注解才会⽣效,所以如果是被代理对象来调⽤这个⽅法,那么@Transactional是不会失效的。

同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现
的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效

第四题 Spring容器启动流程是怎样的?

  1. 在创建Spring容器,也就是启动Spring时:
  2. ⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中
  3. 然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean,对于多例Bean不需要在启动过程中去进
    ⾏创建,对于多例Bean会在每次获取Bean时利⽤BeanDefinition去创建
  4. 利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,这期间包括了合并BeanDefinition、推断构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发⽣在初始化后这⼀步骤中
  5. 单例Bean创建完了之后,Spring会发布⼀个容器启动事件
  6. Spring启动结束
  7. 在源码中会更复杂,⽐如源码中会提供⼀些模板⽅法,让⼦类来实现,⽐如源码中还涉及到⼀些BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过BenaFactoryPostProcessor来实现的,依赖注⼊就是通过BeanPostProcessor来实现的
  8. 在Spring启动过程中还会去处理@Import等注解

第五题 Spring Boot、Spring MVC 和 Spring 有什么区别?

spring是⼀个IOC容器,⽤来管理Bean,使⽤依赖注⼊实现控制反转,可以很⽅便的整合各种框架,提供AOP机制弥补OOP的代码重复问题、更⽅便将不同类不同⽅法中的共同处理抽取成切⾯、⾃动注⼊给⽅法执⾏,⽐如⽇志、异常等

springmvc是spring对web框架的⼀个解决⽅案,提供了⼀个总的前端控制器Servlet,⽤来接收请求,然后定义了⼀套路由策略(url到handle的映射)及适配执⾏handle,将handle结果使⽤视图解析技术⽣成视图展现给前端

springboot是spring提供的⼀个快速开发⼯具包,让程序员能更⽅便、更快速的开发spring+springmvc应⽤,简化了配置(约定了默认配置),整合了⼀系列的解决⽅案(starter机制)、redis、mongodb、es,可以开箱即⽤

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
在这里插入图片描述

相关文章:

  • Cesium 展示——加载 tileset.json 格式的模型数据
  • C++ 文件操作-文本文件-读取和打开文件方法详解
  • 2024022302-关系模型
  • linux增加物理磁盘并挂载到文件系统
  • 解决docker中运行的jar包连不上前端程序
  • 数据库应用:kylin 部署 达梦数据库DM8
  • Linux系列讲解 —— 【Vim编辑器】在Ubuntu18.04中安装新版Vim
  • Linux、Ubuntu、CenterOS、RedHat、Debian、AIpine关系和区别?
  • Vue3的computed计算属性和watch监视(四)
  • 【QT-lineEidte动画效果
  • ubuntu20配置protobuf 2.5.0
  • 编译原理第一章概述,文法,语言学习总结
  • 【Java中23种设计模式-单例模式2--懒汉式线程不安全】
  • 精酿啤酒:麦芽与啤酒花搭配的奥秘
  • MySQL中的高级查询
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Babel配置的不完全指南
  • ES2017异步函数现已正式可用
  • golang 发送GET和POST示例
  • Intervention/image 图片处理扩展包的安装和使用
  • Javascript 原型链
  • Java反射-动态类加载和重新加载
  • Linux链接文件
  • Spring-boot 启动时碰到的错误
  • SQLServer之创建数据库快照
  • Vue 2.3、2.4 知识点小结
  • vue-loader 源码解析系列之 selector
  • Webpack 4 学习01(基础配置)
  • Yeoman_Bower_Grunt
  • 阿里研究院入选中国企业智库系统影响力榜
  • 工作中总结前端开发流程--vue项目
  • 官方解决所有 npm 全局安装权限问题
  • 记一次删除Git记录中的大文件的过程
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 一、python与pycharm的安装
  • #{} 和 ${}区别
  • #14vue3生成表单并跳转到外部地址的方式
  • #Z2294. 打印树的直径
  • $$$$GB2312-80区位编码表$$$$
  • (4)(4.6) Triducer
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (四)Controller接口控制器详解(三)
  • (轉)JSON.stringify 语法实例讲解
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .py文件应该怎样打开?
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [acm算法学习] 后缀数组SA
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [android]-如何在向服务器发送request时附加已保存的cookie数据