Spring源码学习:开头

Spring源码学习

肤浅的学习三个类吧!

BeanDefinition

Bean定义对象,存储的是关于一个bean的描述!如有那些属性,有哪些方法!

BeanDefinitionRegister

Bean定义注册器,主要就是从其他地方(XML文件、YML文件、数据库、网络资源)获取Bean定义,然后加载IOC中,加载的Bean定义都是保存在BeanFactoryMap<String, BeanDefinition> beanDefinitionMap属性中

主要方法:

/**
 * BeanDefinitionRegistry 接口定义了管理和注册 Bean 定义的操作。
 * 它是 Spring 框架的核心接口之一,主要用于注册、移除和获取 Bean 定义。
 */
public interface BeanDefinitionRegistry {

    //注册一个新的 Bean 定义到注册表中。
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;

    //从注册表中移除一个 Bean 定义。
    void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    //获取指定名称的 Bean 定义。
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    //判断注册表中是否包含指定名称的 Bean 定义。
    boolean containsBeanDefinition(String beanName);

    //获取注册表中所有 Bean 定义的名称。
    String[] getBeanDefinitionNames();
}

小小疑问:

  1. BeanDefinitionRegister对象是怎么把加载的数据,传输到BeanFactory的Map里面的?他们两个对象是配合的?
    答案:通常通过继承组合的方式实现;继承案例:DefaultListableBeanFactory 它同时实现了BeanDefinitionRegistry BeanFactory 接口,这样在registerBeanDefinition方法里面,就是通过this.beanDefinitionMap来操作bean定义的注册。

BeanFactory

负责管理 Spring 应用中的 Bean 实例。它定义了 IoC(Inversion of Control,控制反转)容器的基本功能,提供了创建、配置和管理 Bean 的基本机制。

主要功能:

  1. Bean 实例化

根据 Bean 定义创建 Bean 实例。这包括使用构造函数、静态工厂方法或实例工厂方法创建 Bean。

  1. Bean 依赖注入

负责处理 Bean 之间的依赖关系,通过构造器注入、Setter 注入等方式,将 Bean 的依赖注入到 Bean 实例中。

  1. Bean 生命周期管理

管理 Bean 的完整生命周期,包括初始化、销毁等生命周期回调方法(如 init-method 和 destroy-method)。
支持 Bean 的生命周期接口,如 InitializingBean 和 DisposableBean。

  1. Bean 缓存

通常会缓存单例(Singleton) Bean,以提高性能。每次请求单例 Bean 时,都会返回同一个实例,而不是每次都创建新的实例。【还能解决循环依赖】

  1. 别名解析

一个 Bean 可以有多个名称,所有这些名称都指向同一个 Bean 实例。

  1. Bean 延迟初始化(Lazy Initialization)

支持延迟初始化,在真正需要时才创建 Bean 实例,而不是在容器启动时立即创建。

  1. 类型安全的依赖查找

提供类型安全的查找方法,如 getBean(Class requiredType),根据类型查找 Bean 实例。

主要方法:

public interface BeanFactory {
    
    // 根据名称获取 Bean 实例
    Object getBean(String name) throws BeansException;

    // 根据名称和类型获取 Bean 实例
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    // 根据类型获取 Bean 实例
    <T> T getBean(Class<T> requiredType) throws BeansException;

    // 判断容器中是否包含指定名称的 Bean 定义
    boolean containsBean(String name);

    // 判断指定名称的 Bean 是否为单例
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    // 判断指定名称的 Bean 是否为原型
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    // 判断指定名称的 Bean 是否匹配给定类型
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

    // 获取指定名称的 Bean 的类型
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    // 获取指定名称的 Bean 的别名
    String[] getAliases(String name);
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值