BeanDefinition基本定义

BeanDefinition定义了Bean的基本元信息、生命周期方法等。描述了Spring Bean的基本信息。其初始化方法主要有以下两种方式:

本文案例也是基于Spring Framework 5.2.2.RELEASE版本,基础依赖详见Spring依赖查找

1. BeanDefinitionBuilder初始化

BeanDefinitionBuilder提供了几个静态方法创建BeanDefinition,一种是顶层形式的BeanDefinition,一种是普通的BeanDefinition,一种是子类的BeanDefinition。
下述创建一个普通的BeanDefinition:
User对象如下:

public class User {
    private Long id;
    private String name;

    // Get、Set方法略

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

创建BeanDefinition的测试类如下:

public class BeanDefinitionCreatorDemo {
    public static void main(String[] args) {
        createByBeanDefinitionBuilder();
    }

    private static void createByBeanDefinitionBuilder() {
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
        beanDefinitionBuilder.addPropertyValue("id", 1);
        beanDefinitionBuilder.addPropertyValue("name", "Michael");

        BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        System.out.println(beanDefinition);
    }
}

上述创建方式等价于xml中的如下配置:

    <bean id="user" class="com.vielat.spring.ioc.domain.User">
        <property name="id" value="1" />
        <property name="name" value="Michael" />
    </bean>

2. 直接初始化AbstractBeanDefinition

AbstractBeanDefinition有几个具体的实现类,可以分别实例化上述三类BeanDefinition,如下:

  private static void createBeanDefinition() {
        AbstractBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(User.class);

        MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
        mutablePropertyValues.addPropertyValue("id", 1);
        mutablePropertyValues.addPropertyValue("name", "Michael");
        beanDefinition.setPropertyValues(mutablePropertyValues);
        System.out.println(beanDefinition);
    }

上述BeanDefinition对象创建后,不是对象的终态,可以手动进行调整。

posted @ 2023-01-06 23:26  生活咖啡  阅读(232)  评论(0编辑  收藏  举报