Spring Bean
BeanDefinition元信息
BeanDefinition中包含一下元信息:
属性 | 介绍 |
---|---|
Class | Bean全类名 |
Name | Bean名称或者ID |
Scope | Bean作用域 |
Constructor arguments | Bean 构造器参数 |
Properties | Bean属性注入 |
Autowring mode | Bean自动绑定 |
Lazy initialization mode | Bean懒加载 |
Initialization method | Initialization Callbacks |
Destruction method | Destruction Callbacks |
构建BeanDefinition
- 可以通过
BeanDefinitionBulider(org.springframework.beans.factory.support.BeanDefinitionBuilder)
这个类去构建; - 可以创建
GenericBeanDefinition
类构建。
新建Person
类
public class Person{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
//1.通过BeanDefinitionBuilder生成
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Person.class);
BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
beanDefinitionBuilder.addPropertyValue("name","糜了鹿");
MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
PropertyValue propertyValue = propertyValues.getPropertyValue("name");
String name = propertyValue.getName();
Object value = propertyValue.getValue();
System.out.println(name);
System.out.println(value);
//2.通过GenericBeanDefinition
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(Person.class);
MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
mutablePropertyValues.addPropertyValue("name","糜了鹿");
mutablePropertyValues.addPropertyValue("age",18);
genericBeanDefinition.setPropertyValues(mutablePropertyValues);
System.out.println(mutablePropertyValues.get("age"));
}
注册Spring Bean
- 通过注解注册
public static void main(String[] args) {
// 创建 BeanFactory 容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 注册类为配置类 ConfigurationClass
applicationContext.register(ConfigurationClass.class);
// 启动Spring应用上下文
applicationContext.refresh();
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
System.out.println(applicationContext.getBeanDefinitionCount());
Object person = applicationContext.getBean("person");
System.out.println(person);
// 关闭Spring应用上下文
applicationContext.close();
}
public static class ConfigurationClass{
/**
* 通过注解注册Bean
* @return
*/
@Bean(name = {"person"}) //可以指定多个 逗号分割
public Person person() {
Person person = new Person();
person.setName("Milelu");
return person;
}
}
当然还可以通过XML、@Import、@Component注册!
- 通过API的方式注册
public static void main(String[] args) {
// 创建 BeanFactory 容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 注册当前类未配置类 ConfigurationClass
applicationContext.register(MyAnnotationBeanDefinitionDemo.class);
// 启动Spring应用上下文
applicationContext.refresh();
registerBeanDefinition(applicationContext,"person1",Person.class);
registerBeanDefinition(applicationContext,"",Person.class);
Map<String, Person> beansOfType = applicationContext.getBeansOfType(Person.class);
for (String beanName : beansOfType.keySet()) {
System.out.println(beanName);
}
// 关闭Spring应用上下文
applicationContext.close();
}
public static void registerBeanDefinition(BeanDefinitionRegistry beanDefinitionRegistry, String beanName, Class<?> beanClazz){
//1.通过BeanDefinitionRegistry,可以自己指定Bean名称
BeanDefinitionBuilder beanDefinitionBuilder=BeanDefinitionBuilder.genericBeanDefinition(beanClazz);
beanDefinitionBuilder.addPropertyValue("name","糜了鹿");
if (StringUtils.hasText(beanName)){
//1.通过BeanDefinitionRegistry,可以自己指定Bean名称
beanDefinitionRegistry.registerBeanDefinition(beanName,beanDefinitionBuilder.getBeanDefinition());
}else {
//2.自动生成BeanName的方式
BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinitionBuilder.getBeanDefinition(),beanDefinitionRegistry);
}
}
//输出:
//person1
//org.milelu.spring.bean.Person#0 自动生成BeanName是通过BeanNameGenerate#generateBeanName()方法