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定义是什么?这些办法的具体实现又是怎么做的?为什么要这么设计?这些咱们前面再说。