Spring源码学习
就肤浅
的学习三个类吧!
BeanDefinition
Bean定义对象,存储的是关于一个bean的描述!如有那些属性,有哪些方法!
BeanDefinitionRegister
Bean定义注册器,主要就是从其他地方(XML文件、YML文件、数据库、网络资源)获取Bean定义,然后加载IOC中,加载的Bean定义都是保存在BeanFactory
的Map<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();
}
小小疑问:
- BeanDefinitionRegister对象是怎么把加载的数据,传输到BeanFactory的Map里面的?他们两个对象是配合的?
答案:通常通过继承和组合的方式实现;继承案例:DefaultListableBeanFactory
它同时实现了BeanDefinitionRegistry
和BeanFactory
接口,这样在registerBeanDefinition
方法里面,就是通过this.beanDefinitionMap
来操作bean定义的注册。
BeanFactory
负责管理 Spring 应用中的 Bean 实例。它定义了 IoC(Inversion of Control,控制反转)容器的基本功能,提供了创建、配置和管理 Bean 的基本机制。
主要功能:
- Bean 实例化
根据 Bean 定义创建 Bean 实例。这包括使用构造函数、静态工厂方法或实例工厂方法创建 Bean。
- Bean 依赖注入
负责处理 Bean 之间的依赖关系,通过构造器注入、Setter 注入等方式,将 Bean 的依赖注入到 Bean 实例中。
- Bean 生命周期管理
管理 Bean 的完整生命周期,包括初始化、销毁等生命周期回调方法(如 init-method 和 destroy-method)。
支持 Bean 的生命周期接口,如 InitializingBean 和 DisposableBean。
- Bean 缓存
通常会缓存单例(Singleton) Bean,以提高性能。每次请求单例 Bean 时,都会返回同一个实例,而不是每次都创建新的实例。【还能解决循环依赖】
- 别名解析
一个 Bean 可以有多个名称,所有这些名称都指向同一个 Bean 实例。
- Bean 延迟初始化(Lazy Initialization)
支持延迟初始化,在真正需要时才创建 Bean 实例,而不是在容器启动时立即创建。
- 类型安全的依赖查找
提供类型安全的查找方法,如 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);
}