BeanDefinition
BeanDefinition 表示 Bean 定义:
- Spring根据BeanDefinition来创建Bean对象;
- BeanDefinition有很多的属性用来描述Bean;
- BeanDefiniton是Spring中非常核心的概念。
- BeanDefiniton中重要的属性:
a. beanClass:表示一个bean的类型,比如:UserService.class、OrderService.class,Spring在创建Bean的过程中会根据此属性来实例化得到对象;
b. scope:表示一个作用域(Spring中有五种作用域),比如:singleton、prototype分别标识单例Bean、原型Bean;
c. isLazy:表示一个Bean是不是需要懒加载,原型bean和isLazy属性不起作用,懒加载的单例bean,会在第一次getBean的时候生成该bean,非懒加载的单例bean,则会在spring启动的过程中直接生成好;
d. dependsOn:表示一个bean在创建之前所依赖的其他bean得先全部创建好;
e. primary:表示一个bean是主bean,在spring中一个类型可以有个bean对象,在进行依赖注入时,如果根据类型找到了多个bean,此时会判断这些bean中是否存在一个主bean,如果存在,则直接将这个bean注入给属性;
f. initMethodName:表示一个bean的初始化方法,一个bean的生命周期过程中有一个步骤叫初始化,spring会在这个步骤中去调用bean的初始化方法,初始化逻辑由程序员自己控制,表示程序员可以自定义逻辑对bean进行加工。
Spring中的五种作用域
- singleton:在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值
- prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()
- request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
- session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
- globalession:一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境
BeanFactory
- BeanFacory 是一种Spring容器;
- BeanFacory 直译过来就是Bean工厂,它可以用来创建Bean、获取Bean;
- BeanFactory是Spring中非常核心的组件。
FactoryBean 和 BeanFactory 区别?
- BeanFactory:Bean工厂,是一个工厂(Factory),Spring IoC容器 的最高层接口就是BeanFactory,它的作用是管理Bean,即实例化、定 位、配置应用程序中的对象及建立这些对象之间的依赖。
- FactoryBean:工厂Bean,是一个Bean,作用是产生其他Bean实 例。这种Bean没有什么特别的要求,仅需要提供一个工厂方法,该方法 用来返回其他 Bean 实例。在通常情况下,Bean 无须自己实现工厂模 式,Spring容器担任工厂的角色;在少数情况下,容器中的Bean本身就 是工厂,其作用是产生其他Bean实例。 当用户使用容器时,可以使用转义字符“&”来得到FactoryBean本 身,以区别通过FactoryBean产生的实例对象和FactoryBean对象本身。 在BeanFactory中通过如下代码定义了该转义字符:FACTORY_BEAN_PREFIX = “&”
BeanDefiniton、BeanFactory、Bean对象之间的关系?
- BeanFactory将利用BeanDefinition来创建Bean对象;
- BeanDefinition相当于原材料、Bean对象相当于生产出来的产品,BeanFactory相当于工厂;
BeanFactory核心子接口和实现类
- ListableBeanFactory:它可以枚举所有 bean 实例,而不是按照客户的要求逐个尝试按名称查找 bean。预加载所有 bean 定义的 BeanFactory 实现可以实现此接口。
- ConfigurableBeanFactory:大多数bean工厂要实现的配置接口。除了BeanFactory 接口方法之外,还提供了配置 bean 工厂的工具。
- AutowireCapableBeanFactory:由能够自动装配的 bean 工厂实现,前提是他们希望为现有的 bean 实例公开此功能。
- AbstractBeanFactory:抽象基类,提供 ConfigurableBeanFactory SPI 的全部功能。也可以用作 bean 工厂实现的基类,这些实现可以从 resource 资源获取 bean 定义。
- DefaultListableBeanFactory:核心实现类
Bean的生命周期
- Bean生命周期用来描述Spring中一个Bean创建、销毁过程中所经历的步骤,其中Bean创建过程是重点。
- 可以利用Bean生命周期机制对Bean进行自定义加工。
核心步骤
- BeanDefintion
- 构造方法推断
- 实例化(反射)
- 属性填充
- 初始化
- 初始化后