Spring源码分析一:BeanFactory接口详解

Spring源码分析-BeanFactory接口

1.Beanfactory适用场景

BeanFactory提供了最基本的IoC容器的功能,是Ioc容器最基本的表现形式。BeanFactory是一个接口类,下面是Ioc容器中的主要接口设计

Spring源码分析一:BeanFactory接口详解

SpringIoc容器的主要接口

  • BeanFactory 定义了Ioc容器的基本规范,包括getBean这样的Ioc容器的基本方法
    • HierarchiaclBeanFactory 提供getParentBeanFactory方法,允许访问父容器。
      • ConfigurableBeanFactory 定义了一些对BeanFactory的配置功能。比如通addBeanPostProcessor配置Bean后置处理器,setParentBeanFactory设置双亲Ioc容器。

从接口BeanFactory到HierarchiaclBeanFactory,再到ConfigurableBeanFactory是一条主要的BeanFactory设计路径。在这条接口路径设计中,BeanFactory接口定义了基本的Ioc容器规范


  • ListableBeanFactory 细化了许多BeanFactory的接口功能,比如定义了getBeanDefinitionNames 该方法用于获取SpringIoc容器中定义的所有Bean的名称。
    • ApplicationContext 它通过继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory简单Ioc容器的基础上添加了许多对高级容器特性的支持。

第二条接口设计主线是,以ApplicationContext应用上线文接口为核心的接口设计。我们常用的WebApplicationContext或者ConfigurableApplitionContext接口, AnnotationConfigApplicationContext接口。

具体的Ioc容器都是在上面的接口体系下实现的,比如DefaultListableBeanFactory,这个基本的Ioc容器就是实现ConfigurableBeanFactory,从而成为一个简单Ioc容器的实现。XmlBeanFactory,ApplicationContext是在上面的基础上进行扩展。

BeanFactory的接口定义,API说明

名称 方法描述 返回值 code
getBean 根据name获得bean实例,如果在本工厂中没有找到bean则需要在父工厂中寻找 Object Object getBean(String name) throws BeansException;
containsBean 根据所给的name判断是否有对应的beandefinition,如果在本工厂实例中找不到对应的bean,那么就会去父工厂中寻找,3.陷阱出现:这边不管类是否抽象类,懒加载,是否在容器范围内,只要符合都返回true,所以这边true,不一定能从getBean获取实例 boolean , boolean containsBean(String name);
isSingleton 判断获得的bean是否为单例实例,如果是,那么每次调用getBean返回的是同一个对象 boolean boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
getType 根据name,获得对应bean的类型信息 Class Class getType(String name) throws NoSuchBeanDefinitionException;
getAliases 根据name,返回对应的bean的别名 String[] Sting[] getAliases(String name)
isPrototype 是否是prototype类型,这个属性可以由用户在BeanDefinition中指定 boolean boolean isPrototype(String name)

由上面一系列的接口方法,可以使用不同的Bean的检索方法,很方便的从Ioc容器中得到需要的bean。