容 器 初 始 化 主 要 做 的 事 情
![](https://img-blog.csdnimg.cn/img_convert/1bc9d04db5210b8ebc8090a60c91199b.png)
容器的初始化的主要运行流程如下:
首先读取注解与xml配置文件,将这些配置文件载入到内存中,在内存中这些配置文件会被当作一个个的Resource对象,
之后这些对象会被解析成BeanDefinition实例,在最后注册到Spring的容器中
首先我们介绍一下Bean与BeanDefinition的关系:
1.Bean是Spring的一等公民(核心)
1.1:Bean的本质就是Java对象,只是这个对象的声明周期由容器来管理
1.2:不需要为了创建Bean而在原来的Java类上添加任何额外的限制(侵入性极低)
1.3:对Java对象的控制方式体现在配置上(如:注解、xml配置文件)
2.BeanDefinition(Bean的定义):根据配置,生成用来描述Bean的BeanDefinition
常用属性:
作用范围scope(@Scope)
懒加载lazy-init(@Lazy):决定Bean实例是否延迟加载
首选primary(@Primary) : 设置为true的Bean会是优先的实现类
factory-bean和factory-method(@Configuration和@Bean)
BeanDefinition关系图:
![](https://img-blog.csdnimg.cn/img_convert/ca5c418db93bc1004bbc92e4298e1233.png)
1.在Spring中大量运用到了模板模式,图中我们可以看到BeanDefinition是一个接口来的。其定义了主要的功能抽象接口。其主要的实现类有图中三个(RootBeanDefinition、GenericBeanDefinition、ChildBeanDefinition)
2.在Spring2.5之前大部分但是使用的RootBeanDefinition实现类,在2.5版本后出现了GenericBeanDefinition实现类,随之该实现类成了主流。
注:
(在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式)
BeanFactory的介绍
Spring为简单容器
Spring中要求所有的Ioc容器都要实现BeanFactory接口(org.springframework.beans.factory)
BeanFactory是一个顶级的接口,其内部定义了一个String类型的变量,该变量主要用来获取FactoryBean的实例
![](https://img-blog.csdnimg.cn/img_convert/5ea05052f5b65f11caf8ef9769730f8b.png)
该变量的使用例子:
![](https://img-blog.csdnimg.cn/img_convert/5dcd47169db419205fabd1c06e33af25.png)
![](https://img-blog.csdnimg.cn/img_convert/c41c107b118ca061e7d9f30be8b90c5b.png)
BeanFactory和FactoryBean的区别:
BeanFactory:
它是Spring容器的根接口,定义了Bean工厂的最基础的功能特性。是用作Spring中管理Bean的容器。
FactoryBean:
它的本质也是一个Bean,但是这个Bean不像Service和Dao一样用来注入使用的,它的作用是用来生成这些普通的Bean的。
实现了该接口后呢,Spring容器在初始化时,会把实现了这个接口的Bean取出来,然后使用这个Bean中的getObject()方法生成我们想要的Bean。
BeanFactory的方法
getBean():根据名字获取Bean的实例
getAliases():根据别名来获取Bean的实例
isSingleton():校验Bean是否为单例创建
isPrototype():校验Bean是否为多例创建
getType():根据名字获取Bean实例的Class类型
BeanFactory的关系图:
![](https://img-blog.csdnimg.cn/img_convert/4173933de8a7f4aea1d1c4f7ee03329c.png)
ListableBeanFactory:
正如它的名字所示,该工厂的方法可以以列表(Listable)的形式提供Bean的相关信息。最大的特点就是可以批量的列出工厂生产的实例信息
比如该工厂的getBeanDefinitionNames()方法,可以获取容器中所有的Bean名字
getBeanDefinitionCount方法,可以获取容器中注册的BeanDefinition总数