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