BeanDefinition
beanDefinition表示Bean定义,是spring用来生产实例Bean的元数据,如@Component,@Bean,标签等都会解析成bean定义供后续spring容器去生产bean实例。有以下几个主要的属性。
- scope:表示bean的作用域,如单例beansingleton(默认),多例prototype,request每次请求重新实例化,Session每个会话对内是单例的
- lazyInit:是否需要懒加载,懒加载在第一次使用bean时才会被实例化,非懒加载在spring启动时便实例化
- dependsOn:表示这个bean在实例化前需要依赖的其他bean,也就是说需要保证dependsOn数组中的bean先实例化
- primain:表示这个bean是否是主bean,当依赖注入发现多个同类型的bean时,会选择这个primain为true的bean
BeanFactory
BeanFactory是一种spring容器,用来生产bean对象,它有许多实现类,下面介绍一个最重要的实现类DefaultListableBeanFactory
查看它的俩个父类发现父类的方法名称都和Definition,Bean等相关,如registerBeanDefiniton():拥有了注册bean定义的能力,getBeanDefinitionNames():拥有了获取所有bean定义的名称的能力等等,直接推断出这个DefaultListableBeanFactory绝对是用来生产bean的一个容器。
ApplicationContext
ApplicationContext也是bean容器,但他比beanFactory要强大许多,从它的类图可以看到它继承了多个beanFactory,自然的继承了相应的功能,简单来说就是通过继承实现一个功能更加强大的容器。
- EnvironmentCapable:可获取操作系统,环境变量,JVM环境信息等
- MessageSource:获取某些国际化资源
- ApplicationEventPublisher:发布事件功能
- ResourcePatternResolver:加载获取图片,文件等资源的能力
FactoryBean
初学者容易和BeanFactory混淆,它是spring提供的一种灵活的创建Bean的方式,继承FacoryBean,实现getObject方法,返回的对象就会被注入到容器中,当然,这个实现类本身得是一个Bean。下面向容器注册一个实现类FB,那么容器中beanName为”FB“的就是一个Object类(重写的getObject方法返回的是一个Object),而实现得本身的beanName则是加一个&符号,即”&FB“,原理是spring处理这个实现类bean时发现它实现了FactoryBean接口,会去做特殊处理。
package com.foo;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component("FB")
public class FB implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new Object();
}
@Override
public Class<?> getObjectType() {
return null;
}
}
BeanFactoryPostProcessor
它叫beanDefinition后置处理器,它是围绕beandefinition进行增强的,他只有一个方法void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory),形参里是一个beanFactory对象,前面提到beanFactory是容器,可以去生产bean,如它可以通过getBeanDefinition(String)去拿到某个beanDefinition,这样我们就可以随心所欲的去修改beanDefiniton的属性,比如直接把class对象替换成一个Object类,这个beandefinition后续生产的bean便会变成Object类型。也就是说可以利用这个beanDefinition后置处理器去对beanDefinition做一些自定义操作。
BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor,基于注解的spring启动流程中非常核心的一个概念-解析配置类就是这一块处理。主要的调用流程如图,后续会详细介绍具体流程
之所以说这里和解析配置类相关,就是因为有一个叫做ConfigurationClassPostProcessor的类实现了BeanDefinitionRegistryPostProcessor并重写了postProcessBeanDefinitionRegistry方法,解析配置类,将所有的beandefinition注册进来,后续生产bean
BeanPostProcessor
这个就是Bean的后置处理器了,那就是去给bean进行增强的,在源码中主要有9处增强,具体用途如图所示,具体流程后续分析源码