1、spring框架
主要核心 ioc aop
Ioc: 控制反转
依赖注入
Ioc容器
1.1例子
1、婚姻介绍所等同于 spring ioc 容器
2、客户及spring用户
3、个性化需求 及xml或注解(beanDefinition定义 信息)
4、男 女 及 springioc中的bean
婚姻介绍所通过客户提供的个性化需求 创建符合要求的bean 返回给客户
1.2 refresh()流程图
1、通过bean定义信息到ioc容器Definition中获取bean
2、因为配置方法不同所以中间使用抽象方法读取配置信息beanDefinitionReader
3、beanDefinition 定义信息通过反射到beanFactory 中获取bean 实例化 赋值 初始化 得到bean对象
4、spring是一个生态圈基石 可以不断扩展
postProcessor 前置处理器 增强器
5、bean定义信息时可以 给beanFactory配置增强器
实例化 赋值时可以给bean配置增强器
aop就是在这里加入的 动态代理
aop 动态代理 实现 :cglib jdk
2、AbstractRefreshableApplicationContext中refresh()方法
第一步:创建beanFactory
2.1 准备工作PrepareRefresh()
设置启动时间 容器开关 创建当前容器的一些集合
2.2 创建工厂 obtainFreshBeanFactory() DefaultListableBeanFactory
创建容器对象:DefaultListableBeanFactory
加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
refreshBeanFactory() 刷新bean工厂 当存在beanFactory 销毁 保证只有一个bean工厂
createBeanFactory()
创建一个bean工厂 supe父类的方法 双亲委派模式 先去查父类
2.3 prepareBeanFactory(beanFactory)
beanFactory的准备工作,对各种属性进行填充
2.4postProcessBeanFactory(beanFactory) 扩展 增强器
子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码,是有具体实现的
2.5 invokeBeanFactoryPostProcessors(beanFactory) 执行 增强器
调用各种beanFactory处理器
2.6 registerBeanPostProcessors(beanFactory) 注册
实例化 注册 beanPostProcessors
2.7initMessageSource() 基本国际化功能 不重要
2.8 initApplicationEventMulticaster() 初始化事件监听器 多播器
在这里插入图片描述
2.9 onRefresh() 空的 留给子类来初始化其他的bean
2.10 registerListeners() 注册监听器
2.7~2.10和bean没啥太大影响 主要想完成不同阶段处理不同事情
2.11 finishBeanFactoryInitialization(beanFactory) 完成实例化
2.12 finishRefresh();
完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
2.13
通过反射 创建对象
重点 getBean()
doGetBean()
createBean() 循环依赖
doCreateBean() 创建bean对象
createBeanInstance() 没有特殊处理走 无参构造方法
获取构造器
populateBean() 填充属性 赋值
2.12 finishReFresh()
3.如何启动spring
组略步骤:
加载配置文件——》解析——》封装成beanDefinition对象——》实例化——》完整对象——》使用
获取 ApplitationContext对象
Object obj = applicationContext.getBean();
3.2详细步骤
beanDefinition:封装各种属性的一个对象
在容器加载bean的配置文件时因为 配置类型五花八门 (xml properties yml 注解 json)等 所以在封装成beanDefinition对象前 有个抽象类 来解析配置文件beanDefinitionReader
bean生命周期
实例化
初始化
填充属性 set方法 为空属性赋值
调用aware接口方法 (自定义容器 使用 spring容器)
beforebeanpostProcessor(什么都没做)
调用init方法
afterBeanPostProcessor (主要做了动态代理)
完整的bean
销毁过程
spring容器按照使用可以分两类 自定义对象 和容器对象
总结:
1、创建容器
2、加载配置文件封装成beanDefinition
3、调用执行beanFactoryPostProcessor
准备工作
准备beanPostProcessor
准备监听器 广播器
4、实例化
5、初始化
6、获取完整bean对象