Spring5源码 - Bean、BeanDefinition、BeanDefinitionRegistry
Spring解决了一个关键的问题:将对象之间的关系转而用配置管理:
- 依赖注入,依赖关系放在Spring的Ioc容器中管理
- 通过把对象包装在Bean中以达到管理对象和进行额外操作的目的
Bean的本质就是对象,只是这个对象的生命周期由容器来管理。不需要为了创建Bean而在原来的java类上添加任何额外的限制。
对java对象的控制方式体现在配置上,根据配置生成描述Bean的BeanDefinition,常用属性:
- 作用范围scope(作用域@Scope):singleton、prototype、request、session、globalsession
- 懒加载lazy-init(@Lazy) :决定Bean实例是否延迟加载
- 首选primary(@Primary) :设置为true的bean会是优先的实现类
- factory-bean和factory-method(@Configuration和@ Bean)
BeanDefinition 的关系图如下:
AbstractBeanDefinition 中抽取了操作BeanDefinition的共用方法,供其它实现类继承使用。
/**
* 当前类通常应用于在运行时接收多个Bean合并起来的信息,
* 在 BeanDefinition 中有个setParentName(String parentName)的方法,
* 以 parentName 来表示继承关系,RootBeanDefinition可以接收两个具有
* 继承关系的两个BeanDefinition,承接两者合并在一起的除了parentName属性以外的属性
*/
public class RootBeanDefinition extends AbstractBeanDefinition {...}
/**
* 该类不可单独存在,必须要依赖一个父BeanDefinition,
* 目前该类已经完全被GenericBeanDefinition所取代了,
* 故不需要学习
*/
public class ChildBeanDefinition extends AbstractBeanDefinition {...}
/**
* 自Spring2.5以后,该类是以上两种BeanDefinition的更好的
* 替代方案,是通用BeanDefinition的实现。
*/
public class GenericBeanDefinition extends AbstractBeanDefinition {...}
BeanDefinitionRegistry
负责BeanDefinition相关的增删查等
public interface BeanDefinitionRegistry extends AliasRegistry {
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
}