Spring
2021-11-26 17:21:32 1 举报
AI智能生成
Spring
作者其他创作
大纲/内容
1.IOC,DI
IOC
原理:反射+XML
控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring来管理这些,实现解耦
2.AOP
Spring AOP的实现原理 ?
3.SpringMVC
原理
4.Bean的生命周期
基本流程
图片
1.实例化
Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
2.填充属性
Bean实例化后对将Bean的引入和值注入到Bean的属性中
3.执行Aware接口
1.BeanNameAware
2.BeanFactoryAware
3.ApplicationContextAware
4.初始化
1.实现InitializingBean接口
2.使用@PostConstruct注解
3.xml中通过init-method属性指定初始化方法
5.可用状态
指bean已经准备就绪、可以被应用程序使用了,此时bean会一直存在于Spring容器中
6.销毁
1.实现DisposableBean接口
2.使用@PreDestroy注解
3.xml中通过destroy-method属性指定
7.扩展点
InstantiationAwareBeanPostProcessorAdapter
循环依赖
回答Bean的完整生命周期
BeanDefinition阶段
Bean实例化阶段
bean初始化部分
bean的销毁阶段
5.Spring事务
Spring声明式事务管理,核心实现就是基于Aop
6.Spring-IoC源码
流程图1
1.SpringIoC的加载过程
1.实例化化容器:AnnotationConfigApplicationContext
2.实例化工厂:DefaultListableBeanFactory
3.实例化建BeanDefinition读取器: AnnotatedBeanDefinitionReader
其主要做了2件事情 1.注册内置BeanPostProcessor 2.注册相关的BeanDefinition
4.创建BeanDefinition扫描器:ClassPathBeanDefinitionScanner
可以根据配置类扫描到所有的Bean。
此处scanner实例不作为配置类中的扫描实例,此实例是给单独提供给applicationContext去扫描包的
此处scanner实例不作为配置类中的扫描实例,此实例是给单独提供给applicationContext去扫描包的
5.注册配置类为BeanDefinition. register(annotatedClasses)
将配置类注册到BeanDefinitionMap中。
6.refresh()
ApplicationContext 的 refresh() : 整个IOC容器初始化的核心
// 1.刷新预处理,和主流程关系不大,就是保存了容器的启动时间,启动标志等
prepareRefresh();
prepareRefresh();
// 初始化属性配置
initPropertySources();
initPropertySources();
initPropertySources() 在基于web
环境的ApplicationContext子类中有重写
环境的ApplicationContext子类中有重写
// 2. 获取BeanFactory,加载所有bean的定义信息(未实例化) ---BeanDefinition获取
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
在步骤中,会进行 xml配置文件、声明式注解、
以及编程式 的解析 以获取BeanDefinition
以及编程式 的解析 以获取BeanDefinition
其余点: 基于xml配置文件的ApplicationContext可重复刷新,
基于注解类的ApplicationContext只能刷新一次
基于注解类的ApplicationContext只能刷新一次
// 3. BeanFactory的预处理配置
prepareBeanFactory(beanFactory);
prepareBeanFactory(beanFactory);
1、给BeanFactory中设置 类加载器,表达式解析器
2、编码注册ApplicationContextAwareProcessor。
(该类为BeanPostProcessor的实现类,其中主要是处理
几个 Aware 接口的回调,这几个接口会被BeanFactory
直接忽略)
(该类为BeanPostProcessor的实现类,其中主要是处理
几个 Aware 接口的回调,这几个接口会被BeanFactory
直接忽略)
3、有几个类型 直接注入绑定在 beanFactory中
在 BeanFactory 再遇到特定类型(就这几个)的属性注入时,会直接从这几个绑定值
的 Map 中找出对应的值,直接注入进去
的 Map 中找出对应的值,直接注入进去
4、注册监听器钩子
5、为 AOP做准备
6、注册默认的运行时环境Enviroment
// 4. 准备BeanFactory完成后进行的后置处理--这是一个空方法
postProcessBeanFactory(beanFactory);
postProcessBeanFactory(beanFactory);
一般由子类实现(在Web环境下的
ApplicationContext子类中就有该实现)
ApplicationContext子类中就有该实现)
// 5. 执行BeanFactory创建后的后置处理器
invokeBeanFactoryPostProcessors(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);
执行BeanFacotryPostProcessor
(注意,其中还顺带有BeanDefinitionRegistryPostProcessor[最先]
的执行)
(注意,其中还顺带有BeanDefinitionRegistryPostProcessor[最先]
的执行)
// 6. 注册Bean的后置处理器
registerBeanPostProcessors(beanFactory);
registerBeanPostProcessors(beanFactory);
初始化BeanPostProcessor
(将BeanPostProcessor 放入到
BeanFactory中) --因为该类型PostProcessor
是 对 实例化后的bean使用的,肯定不能像上面一样
在这个地方就直接执行..
(将BeanPostProcessor 放入到
BeanFactory中) --因为该类型PostProcessor
是 对 实例化后的bean使用的,肯定不能像上面一样
在这个地方就直接执行..
// 7. 初始化MessageSource
initMessageSource();
--国际化组件
initMessageSource();
--国际化组件
// 8. 初始化 事件派发器
initApplicationEventMulticaster();
initApplicationEventMulticaster();
构造一个 SimpleApplicationEventMulticaster
并放入 BeanFactory中而已
并放入 BeanFactory中而已
// 9. 子类的多态onRefresh
onRefresh(); -- 重要扩展点
onRefresh(); -- 重要扩展点
无论是SpringMVC还是SpringBoot都在此处有自己的扩展
// 10. 注册监听器
registerListeners();
registerListeners();
1、注册所有已经被创建出来的ApplicationListener,绑定到
ApplicationEventMulticaster中
ApplicationEventMulticaster中
2、对于没有被实例化的ApplicationListener,只是先
绑定其beanName 到 事件派发器中
绑定其beanName 到 事件派发器中
3、广播早期事件
// 11. 初始化所有剩下的单例Bean
finishBeanFactoryInitialization(beanFactory);
finishBeanFactoryInitialization(beanFactory);
一个一个的循环初始化那些 非延迟加载的 单实例 (非抽象)bean
// 12. 完成容器的创建工作
finishRefresh();
finishRefresh();
初始化LifeCycleProcessor,
并将refresh的动作传播到生命周期
处理器(其实 就是调用 实现lifeCycle接口的
类的 start()方法)
并将refresh的动作传播到生命周期
处理器(其实 就是调用 实现lifeCycle接口的
类的 start()方法)
广播 ContextRefreshEvent事件
// 13. 清除缓存
resetCommonCaches();
resetCommonCaches();
清除前面使用到的各种乱七八糟
的后面不需要再使用的缓存
的后面不需要再使用的缓存
切入点
7.Spring 解决Bean之间的循环依赖
Spring如何 解决Bean之间的循环依赖
singletonObjects:一级缓存,存放完全初始化好的Bean的集合,从这个集合中取出来的Bean可以立马返回
earlySingletonObjects:二级缓存,存放创建好但没有初始化属性的Bean的集合,它用来解决循环依赖
singletonFactories:三级缓存,存放单实例Bean工厂的集合
图片
为什么使用三级缓存而不是两级
为什么Spring不能解决构造器的循环依赖?
为什么多例Bean不能解决循环依赖?
循环依赖可以关闭
8.描述下BeanFactory
9.BeanFactory和ApplicationContext的区别?
10.Spring中有哪些扩展接口及调用时机
面试题
11.依赖注入4连问
1、依赖注入目的与优点
依赖注入作为IOC的实现方式之一,目的就是解耦
依赖对象 可直接配置。 需要修时,减少了对代码的修改
2、 谁 把 什么 注入 什么
IOC 容器把 对象 注入给 依赖该对象的组件(java对象)
3、如何注入
@Autowaire
@Resource、 @Inject
4、使用setter还是构造注入
12.FactoryBean 与 BeanFactory的区别
BeanFactory : SpringFramework 中实现IOC的最底层容器 (最顶级的接口,ApplicationContext 在最底层组合了BeanFactory)
FactoryBean: 创建对象的工厂Bean, 可以使用它来直接创建一些初始化流程比较复杂的对象
13.SpringFramework中控制Bean生命周期的三种方式
三者的执行顺序: @PostConstruct → InitializingBean → init-method
14.如何描述BeanDefinition
BeanDefinition 描述了 SpringFramework 中 bean 的元信息,它包含 bean 的类信息、属性、行为、依赖关系、配置信息等。BeanDefinition 具有层次性,并且可以在 IOC 容器初始化阶段被 BeanDefinitionRegistryPostProcessor 构造和注册,被 BeanFactoryPostProcessor 拦截修改等
15.如何描述BeanDefinitionRegistry
BeanDefinitionRegistry 是维护 BeanDefinition 的注册中心,它内部存放了 IOC 容器中 bean 的定义信息,同时 BeanDefinitionRegistry 也是支撑其它组件和动态注册 Bean 的重要组件。在 SpringFramework 中,BeanDefinitionRegistry 的实现是 DefaultListableBeanFactory 。
16.如何概述BeanPostProcessor
一个容器的扩展点,可在bean的生命周期过程中,初始化阶段前后添加自定义的处理逻辑,
且 不同的IOC容器建的BeanPostProcessor不会相互干扰
且 不同的IOC容器建的BeanPostProcessor不会相互干扰
17.如何描述BeanFactoryPostProcessor
BeanFactoryPostProcessor 是容器的扩展点,它用于 IOC 容器的生命周期中,所有 BeanDefinition 都注册到 BeanFactory 后回调触发,用于访问 / 修改已经存在的 BeanDefinition 。与 BeanPostProcessor 相同,它们都是容器隔离的,不同容器中的 BeanFactoryPostProcessor 不会相互起作用。
关键点: 改变Bean的定义信息
0 条评论
下一页