spring常见面试题


一、谈下对Spring IOC的理解?

IOC :控制反转,原来由使用者自己创建的对象,将对象的实例化和初始化交给容器帮开发人员实现。通过依赖注入将属性注入到具体的对象当中。 它是我们常说的spring容器,存储对象,在spring中存储对象的时候一般有三级缓存,singletonObjects存放完成的对象,earlySingletonObjects存放半成品对象,singletonFactory用来存放lambda表达式和对象名称的映射,整个spring的生命周期,从创建到使用再到销毁,各个环节都是由容器来帮开发者实现。 。

二、spring容器的生命周期

spring 帮助开发人员管理对象,从对象的产生到销毁环节都由容器来控制,其中主要包含实例化和初始化关键环节,其中还包含一些spring预留的一些扩展点。
  1. 实例化bean对象,通过反射的方式生成,在源码中通过createBeanInstance方法来实例化对象;
  2. 当bean对象创建完成之后,对象的属性值都是默认值,开始对bean的属性进行填充,通过populateBean方法完成对象属性的填充,这里可能会涉及到循环依赖的问题,spring主要通过三级缓存解决该问题;
  3. 向bean对象中设置容器对象属性,会调用invokeAwareMethods方法来将容器对象设置到具体的bean对象中;
  4. 调用BeanPostprocessor中的前置过滤器方法来进行bean对象的扩展工作,applicationContextPostProcessor,EmbeddValueResolver等对象;
  5. 调用invokeInitMethods方法来完成初始化对象方法的调用,如果实现了InitiallizingBean接口,则调用afterPropertiesSet方法来最后设置bean对象;
  6. 调用BeanPostProcessor后置处理器,完成对Bean对象的后置处理工作,aop就在该处实现,实现的接口名字叫做AbstractAutoProxyCreator;
  7. 获取到完整对象,通过getBean的方式去进行对象的获取和使用;
  8. 当对象使用完成之后,容器在关闭的时候,会进行对象销毁,首先会判断是否实现了DispoableBean接口,然后调用destroryMethod方法。

三、BeanFactory和FactoryBean

BeanFactory和FactoryBean都可以用来创建对象,只不过创建的流程和方式不通过。
  • BeanFactory必须严格的遵守对象的创建流程,经过一些列的复杂步骤之后才可以创建出单例对象;
  • FactoryBean 用户可以自定义bean对象的创建流程,一般用来处理有复杂逻辑的bean,包含三个方法,
  •  isSingleton 是否是单例对象;
    
  •  getObjectType 获取对象类型
    
  •  getObject 此方法中可以自己创建对象,使用new的方式或者使用代理的方式,自定义去创建对象。
    

四、循环依赖为什么需要三级缓存

  1. 只有一级缓存是否可行?
    不行,之所以至少需要两级缓存,是因为半成品对象无法暴漏给外部直接使用,所以需要将成品和半成品区分开来,一级缓存存放成品对象,二级缓存放半成品对象。

  2. 只有二级缓存是否可行?
    如果整个spring中不涉及aop存在,那二级缓存足以解决循环依赖问题,如果aop存在就需要使用三级缓存。

  3. 为什么使用三级缓存?
    三级缓存的value是ObjectFactory,是一个函数式接口,不是直接进行调用的,只有在调用getObject方法时才会去调用里面存储的lambda表达式,存在意义就是保证在整个容器的运行过程中同名的bean对象只能有一个。
    当创建出代理对象之后,会同时存在代理对象和普通对象,究竟应该如何选择哪个对象呢?
    当需要代理对象的时候,会用代理生成的对象覆盖原始对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值