Spring5源码 - Bean、BeanDefinition、BeanDefinitionRegistry

Spring框架通过Bean和BeanDefinition管理对象及依赖关系。Bean是受容器管理的对象,其生命周期由容器控制,配置信息则封装在BeanDefinition中。BeanDefinition包括作用域、懒加载、优先级等属性。RootBeanDefinition、ChildBeanDefinition(已被取代)和GenericBeanDefinition是不同类型的BeanDefinition实现。BeanDefinitionRegistry接口负责BeanDefinition的注册和查询。通过配置,Spring实现了依赖注入,简化了对象的创建和管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring5源码 - Bean、BeanDefinition、BeanDefinitionRegistry

Spring解决了一个关键的问题:将对象之间的关系转而用配置管理:

  • 依赖注入,依赖关系放在Spring的Ioc容器中管理
  • 通过把对象包装在Bean中以达到管理对象和进行额外操作的目的

Bean的本质就是对象,只是这个对象的生命周期由容器来管理。不需要为了创建Bean而在原来的java类上添加任何额外的限制。

对java对象的控制方式体现在配置上,根据配置生成描述Bean的BeanDefinition,常用属性:

  • 作用范围scope(作用域@Scope):singletonprototype、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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值