1、谈一下你对spring的理解
2、spring的IOC容器的核心实现原理是什么
3、详细聊一下spring框架中有哪些扩展的方式
4、详细聊一下bean的生命周期
5、BeanFactory和FactoryBean的区别
1、谈一下你对spring的理解
spring 使创建Java 企业应用程序变得更加容易,它提供了在企业环境中接受Java 语言所需的一切,,并支持Groovy 和 Kotlin 作为JVM上的替代语言,并可根据应用程序的需要灵活地创建多种体系结构。从 springFramework 5.0 开始,Spring 而需要 JDK 8(Java SE 8+),并且已经为JDK9 提供了现成的支持。
spring支持各种应用场景,在大型企业中,应用程序通常需要运行很长时间,而且必须运行在 jdk和应用服务器上,这种场景开发人员无法控制其升级周期。其他可能作为一个单独的jar嵌入到服务器去运行,也有可能在云环境中。还有一些可能是不需要服务器的独立应用程序(如批处理或集成的工作任务)。
spring 是开源的。它拥有一个庞大而且活跃的社区,提供不同范围的,真实用户的持续反馈。这也帮助spring不断地改进,不断发展。
Ioc
AOP
spring是一个框架,同时是一个容器,还是一个生态。|
2、详细聊一下bean的生命周期
5个阶段
大致可以分为五个优段
-
分别是创建前准备
-
创建实例化
-
依赖注入
-
缓存容器
-
和销毁实例 这样一些阶段
加载和销毁的时候,配置一些扩展,init-method,destory-method
- 会在 Spring 加载过程中,触发一些回调。
创建前准备:让其扩展
实例化BeanFactoryPostProcessor(BeanFactory后置处理器)
- 会比Bean先实例化
实例化BeanPostProcessor(Bean后置处理器)
实例化BeanPostProcessor实现类
主要作用:
bean 在开始加载之前呢
要从上下文和一些配置中啊
去解析并且查找 Bean有关的扩展实现
- 比如像init-method
- 客器在初始化Bean的时候,会调用的方法
- destroy method
- 客器在销毁Bean的时候,会调用的方法
以及BeanFactoryPostProcessor(BeanFactory后置处理器)
- 这一类 bean 加载过程中的一些
- 前置和后置的一些处理扩展实现
- 这些或者配置啊,
- 其实是Spring 提供给开发省用来去实现Bean 加载过程中的一些扩展
- 在很多的和Sping集成的中间件,也比较常见
- 比如:Dubbo 这样一些中间件
创建实例阶段:反射
第二个是创建实例阶段
- 主要作用:是通过反射,去创建Bean的实例对象
- 并且会扫描和解析,bean 声朋的一些属性
执行Bean的构造器
正式创建Bean
执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法
- 当依赖注入发生之前,Java对象已经创建,
但是Spring Bean还不对外可用
依赖注入阶段:对象依赖
第三个段是依赖主入阶段
如果被实例化的Bean,存在依赖 其他Bean对象的 一些情况。
-
则需要败这些依顿的Ben,进行对象注入
-
比如常见的 @Autowired,以及 Setter注入 等的 配置形式
同时 这个阶段 会融发—些扩展的调用
-
比如说常见扩展类:BeanPostProcessors
- 用来去实现Ban初始化前,后的扩展回调
-
以及像 BeanFactoryAware 等
为Bean注入属性
先设置Bean的name
再设置创建Bean的Factory
- 调用BeanNameAware的setBeanName0方法
测用BeanFactoryAware的setBeanFactory0方法
所有初始化动作(如afterPropertiesSet.init-method等)回调之前,都将把
BeanPostProcessor赋值给新创建的Bean
- 执行BeanPostProcessor的postProcessBeforelnitialization()方法(后置处理器再实例化之前的方法)
设置好所有的Bean属性之后,由BeanFactory调用
- 调用linitializingBeanBgafterPropertieSet0方法
缓存容器阶段:三个缓存 升到1级
主要的作用是把Bean呢 保存到容器
以下Spring的缓存中
到了这个价段的Bean,就可以被开发者去使用了
涉及常见的操作:init:method
- 这个属性配置一些方法,或者这个阶段会被调用
以及 像BeanPostProcessors 的 的后置处理器方法
也会在这个阶段被触发
调用Bean的init-method方法(在配置中属性指定的方法)
执行BeanPostProcessor的postProcessAfterlnitializationQ方法(Bean后置处理器在实例化之后执行)
执行InstantiationAwareBeanPostProcessor的postProcessAfterinitializationQ方法(初始化感知后置处理器在实例化之后执行)
-
我们自己写的业务逻辑,在比后可以正常执行
-
容器初给化成功
-
执行正常调用后,
后面就是销Bean的逻辑
销毁实例:上下文 被关闭
第五个阶段是销毁实例
当Spring的 应用上下文 被关闭的时候
那么这 个上下文中所有的Bean,会被销毁,
- 如果存在Bean,实现了 像 DisposableBean接口,
- 或者配置了,destory-method属胜的一些方法
- 会在这个价段会被调用
销毁实例
调用DiposibleBean的的destory0方法
- 被BeanFactory调用,最终销毁单份例对象
调用Beandestory-method方法(在配置中属性指定的方法