Spring手动构建BeanDefinition的几种方法

本文详细介绍了在Spring中使用GenericBeanDefinition、RootBeanDefinition、ChildBeanDefinition和BeanDefinitionBuilder创建和配置Bean的几种方法,以及AbstractBeanDefinition的灵活性。
摘要由CSDN通过智能技术生成

Spring手动构建BeanDefinition的几种方法

  • GenericBeanDefinition
  • RootBeanDefinition
  • ChildBeanDefinition
  • BeanDefinitionBuilder

GenericBeanDefinition

@Data
public class Student {
    String name;
    int age;
}
public void test() {
	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
	GenericBeanDefinition gBean = new GenericBeanDefinition();
	//设置bean
	gBean .setBeanClass(Student.class);
	//设置属性
	MutablePropertyValues propertys=new MutablePropertyValues();
	propertys.add("name","luxifa").add("age",25);
	gBean .setPropertyValues(mp); 
	// 注册bean
    context.registerBeanDefinition("bean1", gBean );
}

GenericBeanDefinition也可以继承

public void test() {
	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
	GenericBeanDefinition definition1 = new GenericBeanDefinition();
	//设置bean
	definition1.setBeanClass(Student.class);
	//设置属性
	MutablePropertyValues propertys=new MutablePropertyValues();
	propertys.add("name","luxifa").add("age",25);
	definition1.setPropertyValues(mp); 
	// 注册bean
    context.registerBeanDefinition("gBean1", definition1);


    GenericBeanDefinition definition2 = new GenericBeanDefinition();
    definition2.setParentName("gBean1");
    // definition2 的属性继承了 definition1
    context.registerBeanDefinition("gBean2", definition2);
    
	context.refresh();

    Student student1 = (Student) context.getBean("gBean1");
    Student bean2 = (Student) context.getBean("gBean2");
}


RootBeanDefinition

RootBeanDefinition不能有父节点

public void test() {
    // RootBeanDefinition
    RootBeanDefinition definition = new RootBeanDefinition();
    definition.setBeanClass(Student.class);
    definition.getPropertyValues().add("name", "luxifa");
    definition.getPropertyValues().add("age", 25);
    context.registerBeanDefinition("bean1", definition);

    // child
    ChildBeanDefinition definition2 = new ChildBeanDefinition("bean1");
    context.registerBeanDefinition("bean2", definition2);

    // 刷新
    context.refresh();

    Bean bean1 = (Bean) context.getBean("bean1");
    Bean bean2 = (Bean) context.getBean("bean2");
    System.out.println(bean1==bean2);
}

ChildBeanDefinition

ChildBeanDefinition必须有父节点

public void test() {
	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    // RootBeanDefinition
    RootBeanDefinition definition = new RootBeanDefinition();
    definition.setBeanClass(Student.class);
    definition.getPropertyValues().add("name", "luxifa");
    definition.getPropertyValues().add("age", 25);
    context.registerBeanDefinition("rBean1", definition);

    // ChildBeanDefinition
    ChildBeanDefinition definition2 = new ChildBeanDefinition("rBean1");
    context.registerBeanDefinition("rBean2", definition2);
}

BeanDefinitionBuilder

BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Student.class);
//懒加载,调用get("beanname")方法时才实例化
builder.setLazyInit(true);
// builder.getBeanDefinition() 其实是一个 GenericBeanDefinition
context.registerBeanDefinition("hBean", builder.getBeanDefinition());

GenericBeanDefinition跟AbstractBeanDefinition区别

Spring中的GenericBeanDefinition和AbstractBeanDefinition都是BeanDefinition的子类,用于定义bean的元数据信息,但它们的区别如下:

1. GenericBeanDefinition是一个简单的BeanDefinition实现,它没有AbstractBeanDefinition的复杂性和灵活性。它只提供了基本的bean属性定义,如bean的类名、作用域、构造函数参数、属性等。

2. AbstractBeanDefinition是一个抽象类,它提供了更加灵活和丰富的bean属性定义。它可以定义bean的生命周期、依赖关系、初始化方法、销毁方法等。同时,AbstractBeanDefinition还提供了一些扩展点,如BeanPostProcessorFactoryBean等。

因此,如果需要定义一个简单的bean,可以使用GenericBeanDefinition;如果需要定义一个复杂的bean,可以使用AbstractBeanDefinition。

Spring的GenericBeanDefinition和AbstractBeanDefinition都是BeanDefinition接口的实现类,用于定义Spring容器中的Bean。

GenericBeanDefinition是一个简单的BeanDefinition实现,它可以用于定义一个普通的Bean,并且可以设置Bean的Class类型、Scope、构造函数参数、属性等信息。

示例代码:

// 创建一个GenericBeanDefinition
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
// 设置Bean的Class类型
beanDefinition.setBeanClass(UserService.class);
// 设置Bean的Scope为Singleton
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
// 设置构造函数参数
ConstructorArgumentValues constructorArgs = new ConstructorArgumentValues();
constructorArgs.addIndexedArgumentValue(0, "张三");
constructorArgs.addIndexedArgumentValue(1, 18);
beanDefinition.setConstructorArgumentValues(constructorArgs);
// 设置属性
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("email", "zhangsan@example.com");
beanDefinition.setPropertyValues(propertyValues);

AbstractBeanDefinition是一个抽象类,它提供了更加丰富的Bean定义方式,可以用于定义一个完整的BeanDefinition,并且还提供了一些扩展点,比如Bean的初始化方法、销毁方法、Bean的自动注入等。

示例代码:

// 创建一个AbstractBeanDefinition
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(UserService.class)
        // 设置Bean的Scope为Singleton
        .setScope(BeanDefinition.SCOPE_SINGLETON)
        // 设置构造函数参数
        .addConstructorArgValue("张三")
        .addConstructorArgValue(18)
        // 设置属性
        .addPropertyValue("email", "zhangsan@example.com")
        // 设置Bean的初始化方法
        .setInitMethodName("init")
        // 设置Bean的销毁方法
        .setDestroyMethodName("destroy")
        // 设置Bean的自动注入方式
        .setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME)
        .getBeanDefinition();

参考博客:https://juejin.cn/post/6844904118595616782

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>