Spring水滴石穿(一) BeanFactory体系

IoC

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

面向接口编程

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

BeanFactory

Spring水滴石穿(一) BeanFactory体系_第1张图片
其核心主要在于一下几个方法
1.containsBean 判断bean有没有
2.getAliases 获取bean的别名
3.getBean 获取bean,重点方法
4.getBeanProvider 暂不关注
5.getType 获取bean的Class信息
6.isTypeMatch bean跟传入的class是否匹配
getBean就提供了IoC容器的核心功能,bean的获取,那bean的存储呢?也是在这里只不过是采用惰性的方法来创建bean并保存起来

Spring水滴石穿(一) BeanFactory体系_第2张图片
我们可以看到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

Spring水滴石穿(一) BeanFactory体系_第3张图片
这个接口提供了一系列自动装配的功能,装配模式定义为几个常量

    //不自动装配
    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的能力Spring水滴石穿(一) BeanFactory体系_第4张图片
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定义是什么?这些方法的具体实现又是怎么做的?为什么要这么设计?这些我们后面再说。

你可能感兴趣的:(java,spring)