Ioc的本质就是控制权的转移,将建立对象的责任和依赖管理的责任转移到容器中去,这方面的文章已经有不少,不清楚为何须要Ioc的自行了解一下,咱们主要目的是分析Ioc容器的源码实现,了解其运行原理。spring
spring中咱们能够学到其面向接口的编程思想,其对接口的设计和继承引人深思,咱们学习其具体实现前,先看下它的接口继承体系。Ioc容器的核心就是bean的存储和bean的获取,所以才有了后面的接口体系。编程
其核心主要在于一下几个方法
1.containsBean 判断bean有没有
2.getAliases 获取bean的别名
3.getBean 获取bean,重点方法
4.getBeanProvider 暂不关注
5.getType 获取bean的Class信息
6.isTypeMatch bean跟传入的class是否匹配
getBean就提供了IoC容器的核心功能,bean的获取,那bean的存储呢?也是在这里只不过是采用惰性的方法来建立bean并保存起来app
咱们能够看到beanfactory的接口继承体系,其主要直接子接口是HierarchcalBeanFactory,AutowireCapableBeanFactory,ListableBeanFactory三个,至于ApplicationContext后面会说,这个基于IoC容器的基本功能提供了一些高级功能以供上层应用使用,接下来也是先对这三个接口加强介绍一下。ide
public interface HierarchicalBeanFactory extends BeanFactory { @Nullable BeanFactory getParentBeanFactory(); boolean containsLocalBean(String name); }
顾名思义,这是一个能够继承的bean工厂,咱们的一个应用也能够不止一个bean工厂。主要的接口加强
1.getParentBeanFactory 获取父工厂
2.containsLocalBean 是否包含本地bean
这个接口的子接口中定义了设置父工厂的方法,至于为何该接口没有提供呢就交给你们思考了。性能
这个接口提供了一系列自动装配的功能,装配模式定义为几个常量学习
//不自动装配 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 解析已命名beanspa
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定义是什么?这些方法的具体实现又是怎么作的?为何要这么设计?这些咱们后面再说。code