Spring框架之基础类—ChildBeanDefinition实现类

来源:互联网 发布:java小项目开发 编辑:程序博客网 时间:2024/06/09 15:47

一、ChildBeanDefinition简介

该Bean的定义是从其父节点继承设置,子Bean定义对其父级Bean定义有着固定的依赖关系。

子bean定义将继承来自父类的构造函数参数值(在构造函数中调用父级Bean的构造函数)、属性值和方法,并可以选择添加新值。
如果指定了init方法、销毁方法和/或静态工厂方法,它们将覆盖相应的父设置。其余的设置将始终从子定义中获取:依赖、自动装配模式、依赖项检查、单例、延迟初始化。

从spring2.5开始,以编程方式注册bean定义的首选方法是GenericBeanDefinition类,它允许通过GenericBeanDefinition的setParentName方法动态地定义父依赖项。这有效地取代了大多数用例的ChildBeanDefinition类。

二、ChildBeanDefinition源码详解

@SuppressWarnings("serial")public class ChildBeanDefinition extends AbstractBeanDefinition {    private String parentName;      // 父级Bean的名称    /**     * 构造器     */    public ChildBeanDefinition(String parentName) {        super();        this.parentName = parentName;    }    public ChildBeanDefinition(String parentName, MutablePropertyValues pvs) {        super(null, pvs);        this.parentName = parentName;    }    public ChildBeanDefinition(String parentName, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {        super(cargs, pvs);        this.parentName = parentName;    }    public ChildBeanDefinition(String parentName, Class<?> beanClass, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {        super(cargs, pvs);        this.parentName = parentName;        setBeanClass(beanClass);    }    public ChildBeanDefinition(String parentName, String beanClassName, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {        super(cargs, pvs);        this.parentName = parentName;        setBeanClassName(beanClassName);    }    public ChildBeanDefinition(ChildBeanDefinition original) {        super(original);    }    /**     * 基础方法     */    @Override    public void setParentName(String parentName) {        this.parentName = parentName;    }    @Override    public String getParentName() {        return this.parentName;    }    @Override    public void validate() throws BeanDefinitionValidationException {        super.validate();        if (this.parentName == null) {            throw new BeanDefinitionValidationException("'parentName' must be set in ChildBeanDefinition");        }    }    @Override    public AbstractBeanDefinition cloneBeanDefinition() {        return new ChildBeanDefinition(this);    }    @Override    public boolean equals(Object other) {        if (this == other) {            return true;        }        if (!(other instanceof ChildBeanDefinition)) {            return false;        }        ChildBeanDefinition that = (ChildBeanDefinition) other;        return (ObjectUtils.nullSafeEquals(this.parentName, that.parentName) && super.equals(other));    }    @Override    public int hashCode() {        return ObjectUtils.nullSafeHashCode(this.parentName) * 29 + super.hashCode();    }    @Override    public String toString() {        StringBuilder sb = new StringBuilder("Child bean with parent '");        sb.append(this.parentName).append("': ").append(super.toString());        return sb.toString();    }}
阅读全文
0 0
原创粉丝点击