BeanDefinition 属性
属性 | 说明 |
---|---|
Class | 全类名,必须是能实例化的具体类 |
Name | 名称或 ID |
Scope | 作用域(singleton、prototype) |
Constructor arguments | 构造器参数,用于构造器注入 |
Properties | 属性,用于 setter 注入 |
Autowiring mode | 自动装配模式(byName、byType、constructor) |
Lazy initialization mode | 延迟初始化模式(延迟和非延迟) |
Initialization method | 初始化回调的方法 |
Destruction method | 销毁回调的方法 |
构造 BeanDefinition
使用 BeanDefinitionBuilder
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
BeanDefinition beanDefinition = builder
.addPropertyValue("id", 1)
.addPropertyValue("name", "Ada")
.setInitMethodName("initMethod")
.setDestroyMethodName("destroyMethod")
.setScope(BeanDefinition.SCOPE_SINGLETON)
.getBeanDefinition();
new AbstractBeanDefinition
派生类
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues
.add("id", 1)
.add("name", "ada");
beanDefinition.setBeanClass(User.class);
beanDefinition.setPropertyValues(propertyValues);
beanDefinition.setInitMethodName("initMethod");
beanDefinition.setDestroyMethodName("destroyMethod");
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
注册 BeanDefinition
不管是 ClassPathXmlApplicationContext
还是 AnnotationConfigApplicationContext
其 IoC 容器本质是内建的 DefaultListableBeanFactory
其又实现了 BeanDefinitionRegistry
ClassPathXmlApplicationContext
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext();
applicationContext.refresh();
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)applicationContext.getBeanFactory();
beanFactory.registerBeanDefinition("user", beanDefinition);
AnnotationConfigApplicationContext
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.refresh();
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory();
beanFactory.registerBeanDefinition("user", beanDefinition);
也可直接用 AnnotationConfigApplicationContext#registerBeanDefinition
,效果是一样的