Spring水滴石穿(一) BeanFactory体系

IoC

Ioc的本质就是控制权的转移,将建立对象的责任和依赖管理的责任转移到容器中去,这方面的文章已经有不少,不清楚为何须要Ioc的自行了解一下,咱们主要目的是分析Ioc容器的源码实现,了解其运行原理。spring

面向接口编程

spring中咱们能够学到其面向接口的编程思想,其对接口的设计和继承引人深思,咱们学习其具体实现前,先看下它的接口继承体系。Ioc容器的核心就是bean的存储和bean的获取,所以才有了后面的接口体系。编程

BeanFactory

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并保存起来app

image
咱们能够看到beanfactory的接口继承体系,其主要直接子接口是HierarchcalBeanFactory,AutowireCapableBeanFactory,ListableBeanFactory三个,至于ApplicationContext后面会说,这个基于IoC容器的基本功能提供了一些高级功能以供上层应用使用,接下来也是先对这三个接口加强介绍一下。ide

HierarchcalBeanFactory

public interface HierarchicalBeanFactory extends BeanFactory {
    @Nullable
    BeanFactory getParentBeanFactory();

    boolean containsLocalBean(String name);
}

顾名思义,这是一个能够继承的bean工厂,咱们的一个应用也能够不止一个bean工厂。主要的接口加强
1.getParentBeanFactory 获取父工厂
2.containsLocalBean 是否包含本地bean
这个接口的子接口中定义了设置父工厂的方法,至于为何该接口没有提供呢就交给你们思考了。性能

AutowireCapableBeanFactory

image
这个接口提供了一系列自动装配的功能,装配模式定义为几个常量学习

//不自动装配
    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

ListableBeanFactory

beanfactory提供了获取单个bean的能力,那么这个接口就是提供了获取一堆bean的能力image
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

相关文章
相关标签/搜索