Q:
1、谈一下你对spring的理解
2、spring的IOC容器的核心实现原理是什么
3、详细聊一下spring框架中有哪些扩展方式
4、详细聊一下bean的生命周期
5、BeanFactory和FactoryBean的区别
Note:
回答宽泛面试题使用总分的结构回答
框架
spring是一个轻量级框架,方便我们进行应用的开发,我们在应用的时候,原来要使用一个对象的时候,必须要自己new,而有了spring框架之后,不需要我们自己new了,用户直接在容器里面获取就可以了,容器帮我们创建对象以及管理对象的生命周期
容器
在容器里面有很多bean对象,当需要某一些对象的时候,可以用业务代码直接调用,context.getBean()
生态
具有完整的生态体系,当需要某些技术实现的时候基本上都有现成的框架来进行一个相关的使用
基石
spring是一个最基础的支撑,springboot和springcloud都是在spring的基础之上进行扩展开发的
IOC
控制反转,是一种思想,具体的实现是依赖注入,spring框架帮我们构建了一个大容器,在当前的容器里面存放一堆的bean对象,在进行使用的时候可以通过context.getBean()来获取对象,而对象的生命周期的内容都由spring进行管理
PS:bean是一个由Spring IoC容器实例化、组装和管理的对象
bean的定义信息:xml,注解(@Controller,@Service,@Repository)等
bean的定义信息通过BeanDefinitionReader解析之后,放入到容器中的BeanDefinition对象中
PS:
SpringBoot面试问的多的知识点:自动装配,内嵌web容器(通过AbstractApplicationContext.onRefresh()方法实现的)
接口:自上向下,定义规范和约束,不考虑具体实现
抽象类:自下向上,提取公共的属性和方法到父类中
单继承多实现
BeanDefinition通过反射创建对象:实例化-初始化-使用-销毁,也是bean的生命周期
BeanFactory是容器获取对象的根接口,ApplicationContext继承BeanFactory根接口
PostProcessor:后置处理器,或者叫增强器,用来进行某些功能的扩展实现
BeanFactoryPostProcessor-BeanFactory
BeanPostProcessor-Bean
BeanDefinition通过BeanFactoryPostProcessor接口的具体实现来处理Bean的定义信息,如完整的BD对象
PS:Springboot的自动装配原理:
在springboot的启动类上有一个@SpringBootApplication注解,在这个注解里面有三个重要注解构成,@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan,其中@EnableAutoConfiguration中有一个@Import(AutoConfigurationImportSelector.class)一个选择器,在运行过程中会创建AutoConfigurationImportSelector对象,在这个对象中有一个getCandidateConfigurations的方法,找到EnableAutoConfiguration配置项,通过这个配置项找到所有需要自动装配的对象拿出来,返回一个List集合,来进行对象的创建
@Import(AutoConfigurationImportSelector.class)在哪解析的
Import注解的意义是为了帮助我们在程序的运行中添加AutoConfigurationImportSelector.class对象
BeanDefinitionRegistryPostProcessor继承BeanFactoryPostProcessor,中有一个postProcessBeanDefinitionRegistry方法,具体子类实现是:BeanFactoryPostProcessor的具体实现子类:ConfigurationClassPostProcessor,在这里面找实现方法postProcessBeanDefinitionRegistry,往下找回找到processImports方法。
Bean的生命周期:对象创建的标准流程,实例化-初始化-(对创建好的对象进行扩展操作)-使用-销毁
1、实例化:在堆空间中申请内存,通过反射的方式完成,此时对象的属性是默认值(createBeanInstance)
PS:
反射创建对象的三个步骤:获取Class对象-获取构造器-构造器.newInstance()
2、初始化:属性赋值(set方法),包括自定义属性赋值-populateBean,容器对象属性赋值-invokeAwareMethods
此时的对象可以直接进行使用,但是spring是一个生态完善的框架,需要考虑扩展性
3、对创建好的对象进行扩展操作:使用BeanPosrProcessor接口的前置和后置方法
在后置处理方法中创建代理对象,此时使用AOP的动态代理,AOP是整个IOC执行流程中的一个扩展点
在前置处理方法和后置处理方法中间,执行初始化方法(invokeInitMethods),判断是否实现InitializingBean,然后执行afterPropertiesSet()方法,给用户最后一次机会进行属性赋值或方法调用
4、使用
5、销毁
A:
1、spring是面向企业级开发的一款轻量级框架,方便我们进行应用的开发,对象的使用可以直接从容器中获取,容器帮我们创建对象以及生命周期的管理,核心有IOC控制反转和AOP面向切面两部分。
2、IOC容器的核心实现原理是反射,通过反射去创建对象
3、在对象创建好之后,通过前置处理方法和后置处理方法进行扩展,在后置处理方法中涉及到了AOP的动态代理,通过实现BeanPosrProcessor接口的方法进行操作
4、bean的生命周期,大概可以分为实例化-初始化-对创建好的对象进行扩展操作-使用-销毁
实例化:在堆空间中申请内存,通过反射的方式完成,此时对象的属性是默认值,用到了createBeanInstance方法
初始化:属性赋值,包括自定义属性赋值-populateBean,容器对象属性赋值-invokeAwareMethods
对创建好的对象进行扩展操作:包括前置处理方法,执行初始化方法,后置处理方法,在后置处理方法中,涉及到了AOP的动态代理,去进行一些扩展操作,AOP是整个容器执行过程中的一个扩展点
使用
销毁
IOC控制反转,是一种思想,具体的实现是依赖注入,是spring管理对象的容器,对象的定义信息xml、注解、properties等通过BeanDefinitionReader解析,存放到BeanDefinition对象中,通过反射的方式,创建Bean对象,在使用的时候通过context.getBean()来获取,对象的整个生命周期由spring来管理
5、BeanFactory,对象工厂,约等于容器,是从容器中获取对象的出口,也是根接口,ApplicationContext继承BeanFactory
FactoryBean就是一个Bean对象,是一个工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。
FactoryBean在Spring中最为典型的一个应用就是用来创建AOP的代理对象