驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
Spring-01:BeanDefinition的构建和使用
/  

Spring-01:BeanDefinition的构建和使用

BeanDefinition的构建

以下提供了2个方式:

  • 通过构造器BeanDefinitionBuilder
  • 直接实例化GenericBeanDefinition
public static void main(String[] args) {
	// 1.通过 BeanDefinitionBuilder 构建
	BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
	// 通过属性设置
	beanDefinitionBuilder.addPropertyValue("id", 1).addPropertyValue("name", "小马哥");
	// 获取 BeanDefinition 实例,并非 Bean 终态,可以自定义修改
	BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();

	// 2. 通过 AbstractBeanDefinition 以及派生类
	GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
	// 设置 Bean 类型
	genericBeanDefinition.setBeanClass(User.class);
	// 通过 MutablePropertyValues 批量操作属性
	MutablePropertyValues propertyValues = new MutablePropertyValues();
	//推荐使用add 而不是 addProperty
	propertyValues.add("id", 1).add("name", "小马哥");
	// 通过 set MutablePropertyValues 批量操作属性
	genericBeanDefinition.setPropertyValues(propertyValues);
}

使用BeanDefinition

public static void registerUserBeanDefinition(BeanDefinitionRegistry registry, String beanName) {
	BeanDefinitionBuilder beanDefinitionBuilder = genericBeanDefinition(User.class);
	beanDefinitionBuilder.addPropertyValue("id", 1L).addPropertyValue("name", "小马哥");
	// 判断如果 beanName 参数存在时
	if (StringUtils.hasText(beanName)) {
		// 注册 BeanDefinition
		registry.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition());
	} else {
		// 非命名 Bean 注册方法
		BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinitionBuilder.getBeanDefinition(), registry);
	}
}

其中有几个关键:

  • register的实现类通常都是ApplicationContext
  • 假如Bean需要定义名称可以使用registry.registerBeanDefinition
  • 假如不需要名称,那么使用BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinitionBuilder.getBeanDefinition(), registry);
骐骥一跃,不能十步。驽马十驾,功在不舍。