IoC
Ioc 的实质就是控制权的转移,将创建对象的责任和依赖治理的责任转移到容器中去,这方面的文章曾经有很多,不分明为什么须要 Ioc 的自行理解一下,咱们次要目标是剖析 Ioc 容器的源码实现,理解其运行原理。
面向接口编程
spring 中咱们能够学到其面向接口的编程思维,其对接口的设计和继承引人深思,咱们学习其具体实现前,先看下它的接口继承体系。Ioc 容器的外围就是 bean 的存储和 bean 的获取,因而才有了前面的接口体系。
BeanFactory
其外围次要在于一下几个办法
1.containsBean 判断 bean 有没有
2.getAliases 获取 bean 的别名
3.getBean 获取 bean,重点办法
4.getBeanProvider 暂不关注
5.getType 获取 bean 的 Class 信息
6.isTypeMatch bean 跟传入的 class 是否匹配
getBean 就提供了 IoC 容器的外围性能,bean 的获取,那 bean 的存储呢?也是在这里只不过是采纳惰性的办法来创立 bean 并保存起来
咱们能够看到 beanfactory 的接口继承体系,其次要间接子接口是 HierarchcalBeanFactory,AutowireCapableBeanFactory,ListableBeanFactory 三个,至于 ApplicationContext 前面会说,这个基于 IoC 容器的基本功能提供了一些高级性能以供下层利用应用,接下来也是先对这三个接口加强介绍一下。
HierarchcalBeanFactory
public interface HierarchicalBeanFactory extends BeanFactory {
@Nullable
BeanFactory getParentBeanFactory();
boolean containsLocalBean(String name);
}
顾名思义,这是一个能够继承的 bean 工厂,咱们的一个利用也能够不止一个 bean 工厂。次要的接口加强
1.getParentBeanFactory 获取父工厂
2.containsLocalBean 是否蕴含本地 bean
这个接口的子接口中定义了设置父工厂的办法,至于为什么该接口没有提供呢就交给大家思考了。
AutowireCapableBeanFactory
这个接口提供了一系列主动拆卸的性能,拆卸模式定义为几个常量
// 不主动拆卸
int AUTOWIRE_NO = 0;
// 依照名字拆卸
int AUTOWIRE_BY_NAME = 1;
// 依照 Class 拆卸
int AUTOWIRE_BY_TYPE = 2;
// 依照结构器拆卸
int AUTOWIRE_CONSTRUCTOR = 3;
// 智能拆卸,不要用!@Deprecated
int AUTOWIRE_AUTODETECT = 4;
//
String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
1.applyBeanPostProcessorsAfterInitialization
初始化后的回调办法,这里就要提到 bean 的生命周期了
2.applyBeanPostProcessorsBeforeInitialization
初始化前的回调办法
3.applyBeanPropertyValues
设置 bean 的属性了,解决 bean 的属性依赖注入
4.autowire 依据 class 主动拆卸
5.autowireBean 依据 bean 实例主动拆卸
6.autowireBeanProperties 依据 bean 实例主动拆卸属性
7.configureBean 配置一个 bean
8.createBean 创立 bean
9.destroyBean 销毁 bean
10.initializeBean 初始化 bean
11.resolveBeanByName 解析 bean
12.resolveDependency 解析依赖
13.resolveNamedBean 解析已命名 bean
ListableBeanFactory
beanfactory 提供了获取单个 bean 的能力,那么这个接口就是提供了获取一堆 bean 的能力
1.containsBeanDefinition 是否蕴含了 bean 定义,性能不佳,不要频繁调用
2.findAnnotationOnBean 查找 bean 上的注解
3.getBeanDefinitionCount 获取持有的 bean 定义数目,性能不佳,不要频繁调用
4.getBeanDefinitionNames 获取所有的 bean 定义名称
5.getBeanNamesForAnnotation 获取具备指定注解的所有 bean 的名称
6.getBeanNamesForType 获取所有实现了指定 class 的 bean 的名称
7.getBeansOfType 获取所有具备指定 class 的 bean 汇合
8.getBeansWithAnnotation 获取所有具备指定注解的 bean 汇合
疑难?
bean 定义是什么?这些办法的具体实现又是怎么做的?为什么要这么设计?这些咱们前面再说。