SpringIOC源码解析(一)-BeanDefinition和BeanDefinitionRegistry

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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值