总纲领
- 解析读取配置文件
- 解析配置文件,并替换通配符
- 实例化
- 赋值
1.解析读取配置文件
通过BeanDefinitionReader 读取到配置信息。
BeanDefinitionReader: 定义规范,方便拓展
比如你是用xml 还是用properties 或者yaml 只要实现了BeanDefinitionReader 就可以被解析
2.获取到 beanDefinition 后 如果配置内容中有通配符怎么办?
比如:
<property name = url value ="${jdbc.url}">
${jdbc.url} 是不是要替换成连接串?这个时候就需要
BeanFactoryPostProcessor 来完成这个替换操作。
PostProcessor 分类
PostProcessor分为
name | 作用域 |
---|---|
BeanFactoryPostProcessor | 增强/修改beanDefinition信息 |
BeanPostProcessor | 增强/修改bean信息 |
3.进入到BeanFactory
BeanFactory是整个容器的根接口,也是容器的入口
反射:
Constructor ctor = clazz.getConstructor();
Object obj = ctor.instance();
这里用反射做如下操作:
状态 | 具体内容 | 补充 |
---|---|---|
实例化 | 在堆里面开辟一个空间 | 对象的属性值都是默认值 |
初始化 | 给属性设置值 | 1.填充属性,2.执行初始化方法 |
完成 | 完整对象 | context.getBean() |
初始化过程
- 填充属性
- 设置Aware接口的属性
- BeanPostProcessor:before
- 执行init-method
- BeanPostProcessor:after
- 对象创建完成
总结
bean的创建过程用到了IOC 思想,控制反转 ,定义一个接口,不同的实现方式:比如 bean的定义可以是xml也可以是propertis也可以是ymal
都只要实现BeanDefinitionReader 接口就行了
同时bean的创建过程也用到了AOP的思想
具体体现在BeanFactoryPostProcessor和BeanPostProcessor
在原有动作的前提下用代理的方式实现功能的增强