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

news2024/11/29 4:36:51

腾讯面试题:Spring

  • 1.谈一谈spring IOC的理解,原理与实现?
  • 2.谈一谈Spring IOC的底层实现?
  • 3.描述下Bean的生命周期
  • 4.Spring如何解决循环依赖问题?
  • 5.BeanFactory 和FactoryBean有什么区别?
  • 6.Spring 中用到哪些设计模式?
  • 7.Spring的AOP底层实现原理?
  • 8.Spring的事物原理?
  • 9.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的事物传播机制?

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

在这里插入图片描述
一般required,required_new,nested用的最多,这个只需要理解就行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK日志系统搭建

文章目录ES安装ES启动ES错误处理验证Kibana安装Kibana启动 KibanaLogstash安装Logstash启动Logstash项目整合引入依赖logback-spring.xml启动项目在Kibana中查看链接&#xff1a;点击 提取码&#xff1a;yyds ES 安装ES cat >> /etc/sysctl.conf<<- EOF net.ipv…

基于微信小程序的小区疫情防控系统-计算机毕业设计

随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受业主的喜爱&#xff0c;小区疫情防控小程序被业主普遍使用&#xff0c;为方便业主能够可…

G1D33-BTG复现重跑实验

一、复现BTG 复现很简单&#xff0c;所以就记录一些乱七八糟的叭 &#xff08;一&#xff09;传参 传是否使用cuda的参数的时候&#xff0c;发现传True会报错&#xff0c;后来查到链接 https://stackoverflow.com/questions/43381710/unrecognized-arguments-true 如果什么都…

web前端课程设计 基于HTML+CSS+JavaScript汽车自驾游(10个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

web前端网页设计期末课程大作业:中华传统文化题材网页源码——基于HTML实现中国水墨风书画艺术网站(12个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

关于自动化测试的误区——希望能帮助新手正确的了解自动化一些概念。

自动化测试作为软件测试的一种技术手段&#xff0c;时常被大家讨论。本人在自动化技术方面有过略有小成&#xff0c;今天聊一聊关于自动化的一些误区&#xff0c;以帮助新手能正确的了解和认识自动化一些概念。 测试的行为本质是什么&#xff1f; 为什么先从这个概念开始谈起…

React 入门:实战案例 TodoList 删除一条 Item

文章目录目标实现效果实现思路实现步骤第一步&#xff1a;App 组件中定义删除 Todo 的组件方法第二步&#xff1a;App 组件通过 props 传递删除 Todo 的方法到子组件 List第三步&#xff1a;List 组件接收删除 Todo 的方法&#xff0c;并传递给 Item 子组件第四步&#xff1a;I…

JAVA毕业设计——基于Springboot+vue的图书管理系统(源代码+数据库)

github代码地址 https://github.com/ynwynw/bookmanage2-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于Springbootvue的图书管理系统(源代码数据库) 一、系统介绍 本项目分为管理员与普通用户两种角色 体实现功能如下: 用户系统权限控制管理:主要…

热插拔技术--以ADM1177为例说明

综述 ADM1177是一款热插拔控制器&#xff0c;并且还支持电压电流采集&#xff08;12bitADC&#xff09;和传输(IIC).本文着重说明热插拔技术&#xff0c;所以仅说明ADM热插拔处理过程&#xff0c;对于ADC和IIC部分不予说明&#xff0c;请读者自行研究。 热插拔的应用背景 服务…

【GRU回归预测】基于粒子群优化门控循环单元PSO-GRU神经网络实现多输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

SeleniumUI自动化的POM三层架构

目录 1、定义log.py日志 2、在基础封装层初始化类uitls.__init__.py中选择了日志的打印级别, 3、定义页面基础类base_page.py&#xff0c;定义了页面找元素的方法&#xff0c; 4、将百度页面的元素以代码形式保存&#xff0c;baidu.py 5、重新封装浏览器方法, browser.py …

ChatGPT版微信个人号搭建流程

[TOC] 参考链接&#xff1a; github仓库 准备服务器 进入腾讯云服务器官网&#xff0c;搜索“轻量应用服务器”立即选购 注意&#xff0c;地区要选海外&#xff0c;镜像选Docker镜像 购买之后&#xff0c;就进入控制台 然后登陆到shell 安装部署 查看一下docker&#xff0…

【探索Spring底层】11.切点匹配

文章目录1. 前言2. 给一个类中的其中一个方法增强3. 根据注解给方法增强4. Spring中Transactional的底层实现1. 前言 这里主要讲述一些切点匹配的相关例子&#xff0c;其主要是关于切点表达式匹配的实现。 主要有三种例子&#xff1a; 给一个类中的其中一个方法增强根据注解…

Gitee创建自己的仓库并且上传项目

Gitee创建自己的仓库并且上传项目前言在码云上创建仓库上传项目到远程仓库前言 之前用了一段时间的Gitee&#xff08;码云&#xff09;一直想写一篇文章记录下&#xff0c;结果赶上世界杯 被人把苦茶子给抢走了。。。正好这几天筹钱&#xff0c;那就简单记录下。 这里的Git的安…

[附源码]Python计算机毕业设计动漫网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

机器人开发--Pepperl+Fuchs倍加福激光雷达系列

机器人开发--PepperlFuchs倍加福激光雷达系列1 介绍2 R2000系列2.1 按键操作2.2 测量方法2.3 协议2.3.1 文档2.3.2 特点2.3.3 控制 HTTP收发报文格式get_protocol_info设置传感器参数list_parameters – list parametersget_parameter – read a parameterset_parameter – cha…

springboot simple (10) springboot protobuf

教程列表&#xff1a; springboot simple&#xff08;0&#xff09; springboot简介 springboot simple&#xff08;1&#xff09; springboot Helloworld springboot simple&#xff08;2&#xff09; springboot Starter springboot simple&#xff08;3 &#xff09;spri…

Flutter Web CORS问题

Flutter Web CORSCORS 相关概念协议请求跨域问题App2WebCodingAppCORS 相关概念 关于 CORS 概念&#xff0c;可参考 mozilla 的相关文档资料&#xff1a; Cross-Origin Resource Sharing (CORS)Reason: CORS header ‘Access-Control-Allow-Origin’ missing An example of …

震撼发布,快鲸企微工单任务管理系统上线了

快鲸推出的企微SCRM系统被大家所熟知&#xff0c;这是一款帮助企业通过企微维护客户的管理系统。在客户管理服务过程中&#xff0c;很多企业需要通过工单来进行事项处理和文件内容流转&#xff0c;为了满足这方面客户的需求&#xff0c;快鲸工单系统也应运而生。 品牌都将客户的…

关于json的集合接收和多表关联查询

文章目录一、json的接收与发送1.postman工具发送格式2.controller接收处理二、查询集合数据1.利用mybatis-plus进行分页处理三.读取数据配置mapper.xml输出结果提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、json的接收与发送 1.postman工具发送格…