容 器 初 始 化 主 要 做 的 事 情
容器的初始化的主要运行流程如下:
首先读取注解与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关系图:
1.在Spring中大量运用到了模板模式,图中我们可以看到BeanDefinition是一个接口来的。其定义了主要的功能抽象接口。其主要的实现类有图中三个(RootBeanDefinition、GenericBeanDefinition、ChildBeanDefinition)
2.在Spring2.5之前大部分但是使用的RootBeanDefinition实现类,在2.5版本后出现了GenericBeanDefinition实现类,随之该实现类成了主流。
注:
(在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式)
BeanFactory的介绍
Spring中要求所有的Ioc容器都要实现BeanFactory接口(org.springframework.beans.factory)
BeanFactory是一个*的接口,其内部定义了一个String类型的变量,该变量主要用来获取FactoryBean的实例
该变量的使用例子:
BeanFactory和FactoryBean的区别:
BeanFactory:
它是Spring容器的根接口,定义了Bean工厂的最基础的功能特性。是用作Spring中管理Bean的容器。
FactoryBean:
它的本质也是一个Bean,但是这个Bean不像Service和Dao一样用来注入使用的,它的作用是用来生成这些普通的Bean的。
实现了该接口后呢,Spring容器在初始化时,会把实现了这个接口的Bean取出来,然后使用这个Bean中的getObject()方法生成我们想要的Bean。