Spring面试题及框架理解

Spring框架的核心思想就是抽象,
IOC和AOP是核心功能。
从整体来看,包含几大核心顶级接口:
BeanDifinetionReader、BeanFactoryPostProcesser、PostProcesser、BeanFactory、FactoryBean和Environment。
这些接口依次负责Bean的配置信息读取、增强、装载以及系统环境变量依赖,这几个接口就是Spring框架的核心。
Bean在Spring中的生命周期是常考的知识点:
我们需要从Bean的创建,前置增强,初始化,后置增强,disposebean(dispose:处置; 布置; 安排;),最后destroy
可以通过跟踪AbstractApplicationContext的refresh方法,debug一遍,流程大致分为如下几个步骤:
先经历一堆xxxAware把Bean需要的Spring组件调用各种setXXX给bean(比如setApplicationContext你们肯定见过这个方法),然后执行前置增强,也就是postprocesser的beforeinitializing;执行完后就开始初始化bean,初始化方法,然后后置增强,接着disposebean,最后destroy。这里需要注意的是,postprocesser是有顺序的,定义了priorityOrder的会先被执行,然后再执行带了order的。

Spring是设计模式的完美示例,源码中有使用享元、工厂、建造者、适配器、观察者和模板模式,也可以在源码当中仔细品味大神们的抽象思想,这对于我平时的开发很是受用

面试题一: Bean的生命周期详解:

第一阶段(创建 Bean 前的准备)
Bean 在开始加载之前从上下文和一些配置中解析并查找 Bean 有关的一些扩展的实现

1:比如 java 方法本身只有在 spring 初始化加载完之后才会执行,但是可以通过配置=======》innt-method 来改变它的一个规则,在后面容器初始化之前就会与你配置的 innt-method 指定的方法一起执行,还有 destroy-method,容器在销毁 Bena 的时候调用的一些方法。(简单来说,就好比玩王者荣耀有 5 位队友(方法),你个 dog 玩个云中君,开局 4 位队员还在泉水困着,你就先飞出去了)

2:还有 BeanFactoryPostProcessor 这一类的 bean 对加载过程中对前置和后置扩展的处理和实现。然而,这些类是 spring 提供给开发者添加扩展所用的,比如像添加 Dubbo 这样一类的中间件。还有 BeanFactoryProcessor 本身会比 Bean 先实例化。简单来说(你家有个智能洗衣机(BeanFactoryPostProcessor)你已经提前把要洗的衣物(中间件)放进去了,洗衣机启动后,洗衣机会帮你清洗衣服,但是,洗衣机肯定是先洗再脱水,先洗指的是 beanFactoryPostProcessor 处理你扩展的组件,脱水指的是 bean 的实例化,以洗衣机的生命周期概述了 BeanFactoryPostProcessor)

第二阶段(创建实例阶段):
通过反射创建 bean 的实例对象,并且会扫描和解析一些 Bean 扫描的属性和方法 ,算是正式的创建了 Bean,但是这个阶段的 Bean 还不对外可用,因为还没有依赖注入,机制不允许。

第三阶段(依赖注入):
1: 如果被实例化的 bean 依赖于其他的 bean 对象,则会自动或者手动配置要被注入的 bean 来注入对应的 bean 对象。简单来说(在类中有一个 private User user1;的一个对象属性,使用@Autoired(自动装配)给它注入,private User user1;是要被注入的 Bean。而@Autoired 会查找在标注了类似@Component 之类的注解的类,如果有名为 User 的类,则注入,没有就报错呗,除非@Autoired(required = false)表示哪怕没有 User 也不报错)。

2 : 在这个阶段还会触发一些扩展的调用,比如说上述所说 BeanFactoryPostProcessor 在 Bean 创建之前就已经对中间件做好了处理实现,然而在依赖注入这个阶段,会触发 BeanPostProcessors 来回调 BeanFactoryPostProcessor 已经帮你实现的 Bean,简单来说(在家做饭,凉菜(中间件)已经提前调好,已经可以吃了,但是要等热菜(bean)炒好之后一起端上桌)

第四阶段(容器缓存阶段):
将已经准备好的 Bean 保存到 Spring 的容器以及缓存中,现在的 bean 已经可以使用了,在这个阶段还会涉及到一些操作,比如第一阶段所说的 innt-method 所配置的要先执行的方法,在这个阶段就会调用,还有 BeanPostProcessors 后置处理器的方法也会在这个阶段被触发。(就好比上述所说,菜都上好了,等人来齐(一些配置的方法和组件的方法来齐),再开吃)

第五阶段(销毁 Bena):
当 Spring 应用上下文被关闭的时候,上下文中的 Bean 都会被销毁,如果存在的某些 Bean 实现了 DisposableBena 的接口或者配置了上述所说的 destory-method 的一些方法,则会在这个阶段被调用。

面试题二:Spring中 BeanFactory和FactoryBean的区别

Spring的核心功能是IOC和AOP, IOC全称是Inversion of Control(控制反转,Inversion:反转; 倒置; 颠倒;),控制反转的本义就是由容器将设计好的对象提供给开发人员使用,而非开发人员直接直接new。那么设计好的对象在Spring中就需要有一个Bean容器;

BeanFactory就是所有Spring Bean容器的顶级接口,为Spring的容器定义了一套规范,并提供像getBean这样的方法从容器中获取指定的Bean实例。BeanFactory在产生Bean的同时,还提供了解决Bean之间的依赖注入的能力,也就是所谓的DI。

FactoryBean是一个工厂Bean,它是一个扩展接口,并非容器接口,主要的能力是可以自定义生成Bean实例并加载到IOC容器里面。里面有一个重要的方法叫getObject(),这个方法里面就是用来实现动态构建Bean的过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值