BeanDefinition
是什么?
BeanDefinition 是Spring Framework 中定义Bean 的配置元信息接口。
其中里面有:
- Bean的类名
- Bean 行为配置元素,如作用域,自动绑定的模式,生命周期回调等
- 其他Bean 引用,可称为依赖
- 配置设置,比如Bean 属性
具体接口:org.springframework.beans.factory.config.BeanDefinition
如何构建
- 通过BeanDefinitionBuilder
- 通过AbstractBeanDefinition 以及派生类
例子:
public static void main(String[] args) {
//1.BeanDefinitionBuilder 构建
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
builder.addPropertyValue("name", "xxxx")
.addPropertyValue("id", 1);
//获取实例
AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
//2.派生类构建
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(User.class);
//MutablePropertyValues 设置值
MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
mutablePropertyValues.add("name", "xxxx")
.add("id", 1);
genericBeanDefinition.setPropertyValues(mutablePropertyValues);
}
如何将BeanDefinition 注册到IoC容器
BeanDefinition 注册:
- XML配置信息(<bean />)
- Java注解
- @Bean
- @Component
- @Import
- Java API配置元信息
- BeanDefinitionRegistry#registerBeanDefinition
- BeanDefinitionReaderUtils#registerBeanDefinition
- AnnotatedBeanDefinitionReader#register
Java API配置元信息 例子
public static void main(String[] args) {
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext();
registerBeanDefinition2(configApplicationContext, "test",User.class);
registerBeanDefinition2(configApplicationContext, null,User.class);
configApplicationContext.refresh();
Map<String, User> beansOfType = configApplicationContext.getBeansOfType(User.class);
System.out.println(beansOfType);
configApplicationContext.close();
}
public static void registerBeanDefinition2(BeanDefinitionRegistry registry, String beanName, Class<?> beanClass ){
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(beanClass);
builder.addPropertyValue("id",1)
.addPropertyValue("name","asd");
if (StringUtils.hasText(beanName)) {
//命名的方式
registry.registerBeanDefinition(beanName, builder.getBeanDefinition());
}
else {
//非命名的注册方法
BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), registry);
}
}