SpringIOC源码解析(一)-BeanDefinition和BeanDefinitionRegistry
BeanDefinition
什么是BeanDefinition?
BeanDefinition表示是用来描述Bean的,我们来看一下源码中的描述
* A BeanDefinition describes a bean instance, which has property values, * constructor argument values, and further information supplied by * concrete implementations.
* <p>This is just a minimal interface: The main intention is to allow a * {@link BeanFactoryPostProcessor} to introspect and modify property values * and other bean metadata.
第一段描述了BeanDefinition是什么,第二段告诉我们可以通过BeanFactoryPostProcessor去内省和修改BeanDefinition的属性值。
补充:BeanFactoryPostProcessor的调用位置在BeanDefinition收集完成之后与Bean实列化之前。
BeanDefinition中重要的属性
- beanClass:表示一个bean的类型,比如UserService.class、OrderService.class,Spring在创建Bean的过程中会根据此属性来实例化得到对象。
- scope:表示一个bean的作用域,比如:scope等于singleton,该bean就是一个单例Bean; scope等于prototype,该bean就是一个原型Bean。
- isLazy:表示一个bean是不是需要懒加载,原型bean的isLazy属性不起作用,懒加载的单例bean,会在第一次getBean的时候生成该bean,非懒加载的单例bean,则会在Spring启动过程中直接生成好。
- dependsOn:表示一个bean在创建之前所依赖的其他bean,在一个bean创建之前,它所依赖的这些bean得先全部创建好。
- primary:表示一个bean是主bean,在Spring中一个类型可以有多个bean对象,在进行依赖注入时,如果根据类型找到了多个bean,此时会判断这些bean中是否存在一个主bean,如果存在,则直接将这个bean注入给属性。
- initMethodName:表示一个bean的初始化方法,一个bean的生命周期过程中有一个步骤叫初始化,Spring会在这个步骤中去调用bean的初始化方法,初始化逻辑由程序员自己控制,表示程序员可以自定义逻辑对bean进行加工。
来自哪里?
@Component
@Bean
<bean/>
BeanDefinitionRegistry
什么是BeanDefinitionRegistry?
BeanDefinitionRegistry是用来持有BeanDefinition的一个注册集
* Interface for registries that hold bean definitions, for example RootBeanDefinition * and ChildBeanDefinition instances. Typically implemented by BeanFactories that * internally work with the AbstractBeanDefinition hierarchy.
BeanDefinitionRegistry中重要的方法
org.springframework.beans.factory.support.BeanDefinitionRegistry
// 定义bean定义的注册相关方法的接口
public interface BeanDefinitionRegistry extends AliasRegistry {
// 在注册中心注册一个bean定义,必须支持RootBeanDefinition和ChildBeanDefinition
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
// 移除对应bean名称的bean定义
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 返回给定bean名称对应的bean定义
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 检查注册中心是否包含指定名称的bean定义
boolean containsBeanDefinition(String beanName);
// 返回注册中心中所有的bean定义的名称的数组
String[] getBeanDefinitionNames();
// 返回注册中心中bean定义的个数
int getBeanDefinitionCount();
// 返回beanName是否被占用,即已经在注册中心中注册了bean定义
boolean isBeanNameInUse(String beanName);
}