Spring5源码3-BeanDefinition

2022-11-23  本文已影响0人  分布式与微服务

1. BeanDefinition

BeanDefinition在spring中贯穿始终,spring要根据BeanDefinition对象来实例化bean,只有把解析的标签,扫描的注解类封装成BeanDefinition对象,spring才能实例化bean

beanDefinition主要实现类:

2. ChildBeanDefinition

ChildBeanDefinition 是一种 BeanDefinition,它可以继承它父类的设置,即 ChildBeanDefinition 对 RootBeanDefinition 有一定的依赖关系。

ChildBeanDefinition 从父类继承构造参数值,属性值并可以重写父类的方法,同时也可以增加新的属性或者方法。(类同于 java 类的继承关系)。若指定初始化方法,销毁方法或者静态工厂方法,ChildBeanDefinition 将重写相应父类的设置。 depends on,autowire mode,dependency check,singleton,lazy init 一般由子类 自行设定。

3. GenericBeanDefinition

从 spring 2.5 开始,提供了一个更好的注册 BeanDefinition 类 GenericBeanDefinition,它支持动态定义父依赖,方法是 GenericBeanDefinition.setParentName(java.lang.String),GenericBeanDefinition 可以有效的替代 ChildBeanDefinition 的绝大分部使用场合。

GenericBeanDefinition 是一站式的标准 BeanDefinition,除了有指定类、可选的构造参数值和属性参数这些其它 BeanDefinition 也有的特性外,它还具有通过 parenetName 属性来灵活设置 parent BeanDefinition。

通常, GenericBeanDefinition 用来注册用户可见的 BeanDefinition(可见的 BeanDefinition 意味着可以在该类 BeanDefinition 上定义 post-processor 来对 bean 进行操作,甚至为配置 parent name 做扩展准备)。RootBeanDefinition / ChildBeanDefinition 用来预定义具有 parent/child 关系的 BeanDefinition。

4. RootBeanDefinition

一个 RootBeanDefinition 定义表明它是一个可合并的 BeanDefinition:即在 spring beanFactory 运行期间,可以返回一个特定的 bean。RootBeanDefinition 可以作为一个重要的通用的 BeanDefinition 视图。

RootBeanDefinition 用来在配置阶段进行注册 BeanDefinition。然后,从 spring 2.5 后,编写注册 BeanDefinition 有了更好的的方法:GenericBeanDefinition。 GenericBeanDefinition 支持动态定义父类依赖,而非硬编码作为 root BeanDefinition。

5. GenericBeanDefinition创建实例

创建实体类UserClass

public class UserClass {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

创建实现类BeanDefinitionTest,实现BeanDefinitionRegistryPostProcessor接口

@Component
public class BeanDefinitionTest implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(UserClass.class);
        MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();
        propertyValues.addPropertyValue("username", "fisher");
        registry.registerBeanDefinition("UserClass", genericBeanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }

}

测试方法

public void test3() {
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext("spring.xml");
    UserClass userClass = (UserClass)applicationContext.getBean("UserClass");
    System.out.println("UserClass-->" + userClass.getUsername());
}

查看打印


6. BeanDefinition中的属性

上一篇 下一篇

猜你喜欢

热点阅读