Spring 常见问题


1. Spring循环依赖相关问题

 spring三层缓存的第二层缓存有什么用?循环依赖为什么要使用三级缓存?二级不能解决么?beanB从三级缓存中获取beanA以后提升到二级缓存 ?循环依赖涉及二级缓存具体作用是什么,一般不用二级缓存也能实现?为什么spring无法处理基于构造器的循环依赖问题?二级缓存为什么要放入代理对象?直接放入三级缓存中未成形对象不可以嘛?
Spring中循环依赖场景有:
 构造器的循环依赖(构造器注⼊)Field 属性的循环依赖(set注⼊)

其中,构造器的循环依赖问题⽆法解决,只能拋出 BeanCurrentlyInCreationException 异常,在解决属性循环依赖时,spring采⽤的是 提前暴露对象 的⽅法。

Spring 的循环依赖的理论依据基于 Java 的引⽤传递,当获得对象的引⽤时,对象的属性是可以延后设置的,但是构造器必须是在获取引⽤之前。

Spring利用singletonObjects, earlySingletonObjects, singletonFactories三级缓存去解决循环依赖问题
三个缓存其实就是三个Map:

解答:三个缓存 各司其职(鸡蛋不要放到一个篮子里),面向对象设计的原则,就是这么设计的!
 将成型的bean和不成形的bean分开,分别存储一级存储:存储成型的bean二级缓存:存储不成形的bean,未来可以存储增强后得bean三级缓存是不成形得bean,在三级缓存向二级缓存存储bean得时候,可以执行增强操作,获取bean得代理对象三级缓存:存储数据形式<key , 工厂> 的形式
例如:
 A对象,对A对象进行了AOP增强B对象
ioc实例化bean过程:

具体源码剖析流程参考:Spring循环依赖源码剖析


2. SpringBean的生命周期

Bean ⽣命周期的整个执⾏过程描述:

  1. 根据配置情况调⽤ Bean 构造⽅法或⼯⼚⽅法实例化 Bean。
  2. 利⽤依赖注⼊完成 Bean 中所有属性值的配置注⼊。
  3. 如果 Bean 实现了 BeanNameAware 接⼝,则 Spring 调⽤ Bean 的 setBeanName() ⽅法传⼊当前 Bean 的 id 值。
  4. 如果 Bean 实现了 BeanFactoryAware 接⼝,则 Spring 调⽤ setBeanFactory() ⽅法传⼊当前⼯⼚实例的引⽤。
  5. 如果 Bean 实现了 ApplicationContextAware 接⼝,则 Spring 调⽤ setApplicationContext() ⽅法传⼊
    当前 ApplicationContext 实例的引⽤。
  6. 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调⽤该接⼝的预初始化⽅法
    postProcessBeforeInitialzation() 对 Bean 进⾏加⼯操作,此处⾮常重要,Spring 的 AOP 就是利⽤它实现的。
  7. 如果 Bean 实现了 InitializingBean 接⼝,则 Spring 将调⽤ afterPropertiesSet() ⽅法。
  8. 如果在配置⽂件中通过 init-method 属性指定了初始化⽅法,则调⽤该初始化⽅法。
  9. 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调⽤该接⼝的初始化⽅法 postProcessAfterInitialization()。
    此时,Bean 已经可以被应⽤系统使⽤了。
  10. 如果在 中指定了该 Bean 的作⽤范围为 scope=“singleton”,则将该 Bean 放⼊ Spring IoC 的缓存池中,
    将触发 Spring 对该 Bean 的⽣命周期管理;如果在 中指定了该 Bean 的作⽤范围为 scope=“prototype”,则将该 Bean 交给调⽤者,调⽤者管理该 Bean 的⽣命周期,Spring 不再管理该 Bean。
  11. 如果 Bean 实现了 DisposableBean 接⼝,则 Spring 会调⽤ destory() ⽅法将 Spring 中的 Bean 销毁;
    如果在配置⽂件中通过 destory-method 属性指定了 Bean 的销毁⽅法,则 Spring 将调⽤该⽅法对 Bean 进⾏销毁。
    注意:Spring 为 Bean 提供了细致全⾯的⽣命周期过程,通过实现特定的接⼝或 的属性设置,都可以对 Bean 的⽣命周期过程产⽣影响。
    虽然可以随意配置 的属性,但是建议不要过多地使⽤ Bean 实现接⼝,因为这样会导致代码和 Spring 的聚合过于紧密


3. Spring是如何对XXXService进行依赖注入的(Service没有set方法和构造方法)

反射的方式


4. spring源码分析中核心流程有哪些?面试的或工作中写代码能借鉴的

容器初始化流程
循环依赖流程


5. bean中如果又多个构造方法,容器初始化的时候要怎么去选择?

选择无参构造器,必须有无参构造器


6. Spring源码类名都很长,如何记住层层调用关系?面试提问源码问题一般细到什么层级?

了解机制原理/流程即可、不问类名


7. set方式注入时,property标签里面的name属性是需要注入的类名还是属性名,跟同事争论了很久,官方文档是写的属性名,但是老师讲的例子里面是写的类名,很困惑

setXXX中的XXX,其实不是属性名称和类名称


8. static方法和单例实例方法在内存中有什么区别,分别在什么情况下使用?单例的实例方法在多线程访问时是否有性能瓶颈?

静态方法在类加载的时候就创建了,实例方法当对象实例化的时候才去占用内存
static方法区占用内存区域有限(连续占用内存区域,执行性能稍高),太多会影响性能
实例方法是离散分布的

一般工具方法都设置成static

单例的实例方法在多线程访问时 如果存在成员变量、操作了成员变量,考虑到锁的时候,就影响性能


9. Spring容器里的单例bean如果有非静态成员变量int a=0,业务方法中会改变a的值,那么第二次调用该bean的时候a的初始值还是0吗?

不是


10. Spring容器在初始化一个bean的时候会做那些事情,顺序是怎样的,在容器关闭的时候,又会做哪些事情

在spring的BeanFactory工厂列举了很多接口,代表着bean的生命周期,我们主要记住的是我圈红线圈出来的接口, 再结合spring的源码来看这些接口主要是在哪里调用的


14. Spring事务失效场景及原理

1)吃异常
2)数据库引擎不支持事务
3)非public方法
4)调用同类的方法 等


15. 自定义依赖注入注解不是很清楚

注解就是一个标记,不同的标记表明我们要针对类、字段、或者方法做一些什么事情


16. spring源码中总共用到了哪些设计模式,具体体现在哪?


17. 单例 多个线程取去会怎么样?

如果单例中操作成员变量,会造成并发问题


18. 如果autowired注入时使用的是接口,如何在ioc容器中定位实现类

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

按照名称和类型


19. 如何自定义一款spring的插件,比如做一个通用的权限拦截,然后根据用户的登录信息去用户中心查看是否有权限,在sprinng加载的时候,就把该插件加载进去?然后业务代码中这块完全不写可以做到吗?

说的这个就是SpringMVC拦截器

定义拦截器,注册到容器中


20. 事务的超时这个地方是怎么控制的?

timeout


21. Spring 循环注入有什么好处

是个问题,而非好处,我们尽量避免这种情况发生


22. 为什么不能将对象注入到servlet

bean对象在spring容器中,servlet在servlet容器中;

  1. 可以通过Spring暴露的接口方法,WebApplicationContextUtils.getWebApplicationContext获取到容器,然后getBean
  2. 也可以使用@Autowired,但是需要做一些配置
public void init() throws ServletException {WebApplicationContextUtils.getWebApplicationContext(getServletContext()).getAutowireCapableBeanFactory().autowireBean(this);}

23. 自定义注解实现动态代理,怎么作用于方法上边

对象是类的对象,方法级别控制直接在Invoke方法中判断Method是否有相应注解即可


24. PROPAGATION_NESTED 嵌套事务什么意思

PROPAGATION_NESTED 开始一个 “嵌套的” 事务, 它是已经存在事务的一个真正的子事务。潜套事务开始执行时, 它将取得一个 savepoint
如果这个嵌套事务失败, 我们将回滚到此 savepoint。潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交
如果外部事务 commit, 潜套事务也会被 commit, 这个规则同样适用于回滚.


25. spring多例模式管理的bean是用户获取的时候才去初始化,那么这种方式和new出来的实例有什么区别,相比而言有哪些优势

无对比性,spring ioc是管理单例对象,多例模式只是为了支持可能的其他需求


26. 容器为什么要设计@Compoment, @Repository, @Service, 只用一个注解实现不是更好管理吗?

为了让我们更方便的按层次管理代码

27. spring的单例Bean是线程安全的吗?

不是,在bean中如果维护了成员变量,请自行控制其并发访问
可以通过参数传递去避免比较好

28. servlet是单例模式,为什么doGet和doPost不需要synchronized修饰?单例如何保证高并发时的性能?(假如存在实例变量)

servlet本身没有替我们考虑线程安全问题,需要我们自己考虑

  1. 避免使用实例变量(推荐)
  2. synchronized同步 / ThreadLocal
  3. 实现SingleThreadModel 接口

最好避免使用成员变量(设计的角度)

29. 事务从手写改为动态代理,转账时执行了两次Update,第一次执行的时候代理对象会提交了事务,第二次执行Update时,出现了问题第一次的Update已经提交了就不能回滚了吧?

第一次的并没有提交,同一个事务

30. 能不能给我们讲讲大型互联网企业在使用spring国际化的一些经验

国内使用国际化较少
前端页面 /spring国际化 / 后台实现 /单独写一套/ 等方案

31. "spring在进行初始化beanDefinition的时候,是否对每一个加上@Component或者@Service等注解的类,都保留了既可以根据该类的类型得到bean对象,又可以根据该类的名称得到bean对象,也可以根据该类的自定义注解名得到该对象?

实际不需要存储两台,存储两套是一种实现的方式

32. TransactionStatus这个类具体有啥用?

查看事务的状态

33. 分布式事物该怎么去实现,大致思路是什么怎么控制

思路:外围启动一个大事务,包含很多小的事务;最终大事务的提交与否,需要依靠各个小事务来决定

比如阿里的seata: (分布式事务的一种解决方案)
Seata 的设计思路是将一个分布式事务可以理解成一个全局事务,下面挂了若干个分支事务,而一个分支事务是一个满足 ACID 的本地事务,因此我们可以操作分布式事务像操作本地事务一样。
Seata 内部定义了 3个模块来处理全局事务和分支事务的关系和处理过程,这三个组件分别是:
Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager ™: 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。

34. spring应用如此广泛,那么他有哪些不足,或者说我们在哪些业务场景可以不考虑spring

小型项目引入Spring增加了复杂度
核心功能基于容器
一旦引入spring,和它的耦合就会很大

35. 由于现在接触的都是传统的垂直架构系统,知道spring这样用,在大型分布式系统中spring是怎么玩的?有不一样的地方或注意点吗?

互联网公司很多都摆脱了垂直架构了
IOC和aop是核心,这是不变的玩法一样,后面有SpringBoot,微服务SpringCloud

36. ThreadLocal在Spring中是怎么使用的?

无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全的“状态性对象”采用ThreadLocal进行封装,让它们也成为线程安全的“状态性对象”,因此有状态的Bean就能够以singleton的方式在多线程中正常工作

37. 面试中被问到的,如何用aop实现一个参数校验器

在前置通知中配置切入点拦截方法
取出参数,校验参数(可以自定义一些注解,添加到参数上(非空,长度限制... ...))
在aop的横切逻辑中解析注解,判断是否符合要求

38. spring初始化过程中都有加锁,spring初始化过程是并发的吗?

防止并发刷新,例如refresh可以手动触发,防止并发操作

39. spring有几种事件类型?怎么使用?他们的作用是什么?如果自定义一个事件?

ContextRefreshedEvent
ContextStartedEvent
ContextStoppedEvent
ContextClosedEvent
RequestHandledEvent定义bean,实现ApplicationListener接口即可

40. 当一个接口有多个实现类,且这些实现类都有@Service注解,那么在beanDefinition中是怎么存放的呢?为什么这样@Autowired就会报错呢?

多个beanDefinition
一个接口,多个实现类,不知道具体应该使用哪个实现类,需要格外指定,否则报错

41. spring是怎么集成tomcat,然后进行启动的?

ContextLoaderListener  初始化spring容器操作

42. spring学完了,其中的组件,还不能串起来,譬如web,orm,oxm,jms,servlet

spring全家桶还没有学完

43. 从ThreadLocal中获取Connection,完成后而不手动移除,会不会造成内存泄露?

可以手动销毁资源,如果当前请求处理线程销毁了,也会销毁内部资源

44. 事务A调用事务B Brollback 事务A 也rollback吗

方法之间调用,方法中的事务和事务的传播行为的设置有关

45. 有些时候循环依赖是否可以通过懒加载的方式解决,如果可以,这种方式和spring解决循环依赖相比有什么区别?

懒加载解决不了循环依赖问题,只是掩耳盗铃把问题后置罢了

46. 有参构造注入为什么无法解决循环依赖?(set注入可以)

对象还没实例化完
set注入是把对象实例化后,进行注入对象的半成品

47. ThreadLocal 如果配合线程池使用,线程会重复使用,这样会有安全嘛?

需要清理控制,进行初始化的设置

Spring 常见问题( 持续更新... ... )相关推荐

  1. 常见问题(持续更新)

    近期整理的初级开发遇到的问题,希望对大家有用. 1.Unsatisfied dependency expressed through field 'baseMapper'     于是在pom.xml ...

  2. spring 笔记持续更新2012年9月16日 11:54:45

    spring笔记 点击下载立体结构笔记http://download.csdn.net/detail/yao__shun__yu/4608595 点击进入我的个人编程网站,初步建设中http://mo ...

  3. 网络安全运维面试常见问题持续更新【1】:

    网络安全类常见知识: 1.怎么样提高局域网安全? 第一:安全漏洞时时修补 第二:择优使用防火墙[1.过滤型防火墙2.检测型防火墙3.代理型防火墙] 第三:及时升级杀毒软件 第四:安全策略,定期进行漏洞 ...

  4. [持续更新]UnsatisfiedLinkError常见问题及解决方案

    [持续更新]UnsatisfiedLinkError常见问题及解决方案 参考文章: (1)[持续更新]UnsatisfiedLinkError常见问题及解决方案 (2)https://www.cnbl ...

  5. 【帆软报表】使用技巧及常见问题汇总-持续更新

    [帆软报表]使用技巧及常见问题汇总-持续更新 1.重复与冻结设置,做用:冻结区域 模板-重复与冻结设置 2.单元格有效小数设置 选中单元格-格式-数字-#0.00 3.图表中有效小数设置 图表属性表- ...

  6. TS 常见问题整理(60多个,持续更新ing)

    TS 常见问题整理(60多个,持续更新ing) https://cloud.tencent.com/developer/article/1593335

  7. 【Spring Boot官方文档原文理解翻译-持续更新中】

    [Spring Boot官方文档原文理解翻译-持续更新中] 文章目录 [Spring Boot官方文档原文理解翻译-持续更新中] Chapter 4. Getting Started 4.1. Int ...

  8. Spring Boot 2.4.0 M2 Release Notes持续更新

    Spring Boot 2.4.0 M2 Release Notes持续更新 Spring Boot 2.4.0 M2 Release Notes Spring Boot 2.4.0 M2 Relea ...

  9. 快应用开发常见问题以及解决方案【持续更新】

    接触快应用也有一段时间了,踩过了大大小小的坑,让我活到了今天.准备在此立贴持续更新,记录遇到的问题以及解决方案,造福大众. css 方面 1.文字竖排不支持 目前官方还不支持writing-mode, ...

最新文章

  1. Forever +nginx部署Node站点
  2. torch拼接合并 cat优化记录
  3. ios越狱系统UIGestureRecognizer事件截获问题
  4. cg word List 1
  5. HTML的DOM和XML的DOM对象的区别
  6. 【Java学习笔记之十一】Java中常用的8大排序算法详解总结
  7. 怎么训练 GAN 网络
  8. matlab四大取整函数fix,floor,ceil,round
  9. 【centos7x86】安装源 设置基础软件仓库时出错 解决办法
  10. 出入库单据小票移动打印,盘点机PDA连接蓝牙打印机打印单据小票
  11. SQL三个表关联查询
  12. 学术写作 系列1 HOW TO WRITE AN INTRODUCTION
  13. Jquery点击切换播放不同的Flv视频文件
  14. Julia Computing获得 2400 万美元融资,前 Snowflake CEO 加入董事会
  15. Led台灯对眼睛好吗?2022双十一不伤眼的护眼灯推荐
  16. C#隐藏tabcontrol
  17. 实用办公工具合集,手把手教学,附软件包
  18. Oracle ORA-06502 数字或值错误
  19. 2020年汽车驾驶员(初级)考试平台及汽车驾驶员(初级)模拟考试软件
  20. 计算机考试去底纹,Excel2007应用或删除单元格底纹

热门文章

  1. Vue动态传值与接收步骤
  2. AngularJs angular.equals
  3. 《奠基计算机网络》2011年8月15日出版 视频下载 http://www.91xueit.com
  4. zt:tcpdump抓包对性能的影响
  5. leetCode 6. ZigZag Conversion 字符串 (上传费劲)
  6. 《Android游戏开发详解》——第2章,第2.10节使用对象
  7. 使用Akka持久化——消息发送与接收
  8. 组策略参考文档1-共享打印机
  9. 【cocos2d-x从c++到js】13:回调函数2——JSCallbackWrapper
  10. 主键、聚集索引、非聚集索引区别