前言
BeanDefinition是spring中关于bean的元数据的描述。在spring中无论是xml配置的bean、自动扫描的bean还是java配置的bean最后都会转换成BeanDefinition,再根据这个BeanDefinition来进行bean的创建。BeanDefinition的继承能够简化代码和配置,好处还是很很明显的。
要实现BeanDefinition的继承,给大家推荐两种方式,一种是xml配置bean时的parent属性,一种是自动扫描时继承带有@Autowired注解属性的父类。
通过parent属性来继承BeanDefinition
parent这个属性很容易让人和java的继承联系起来。其实,这个parent和java的继承并没有什么关系,它只是一种Bean Definition的继承,用于简化bean的配置。子BeanDefinition能够继承父Bean Definition的配置信息,也能覆盖和新增配置信息。通常父bean都被设置成抽象类或者在xml中设置其abstract属性为"true"。
使用parent属性的必要条件就是含有parent属性的bean必须能够接受合并后的BeanDefinition,如果无法接收的话,容器会启动报错。
下面描述了子BeanDefinition对于父BeanDefinition的继承情况。
子BeanDefinition能够继承父BeanDefinition的配置:
1. scop
2. constructor
3. property
4. method overrides
子BeanDefinition会覆盖父BeanDefinition的配置:
1.initialization method
2.destroy method
3.static factory method settings
子BeanDefinition不会继承父BeanDefinition的配置:
1.depends on
2.autowire mode
3.dependency check
4.singleton
5.lazy init
代码示例
下列代码展示了parent属性的用法,其中DerivedTestBean从父BeanDefinition中继承了age属性的配置并覆盖了name属性的配置。
<bean id="parentBean" abstract="true" class="org.springframework.beans.TestBean"> <property name="name" value="parent"/> <property name="age" value="1"/></bean>
<bean id="subBean" class="org.springframework.beans.DerivedTestBean" parent="parentBean" init-method="initialize"> <property name="name" value="override"/></bean>
通过父类来继承BeanDefinition
定义父类,下列代码中的父类包含了OtherBean这个属性,它带有Autowired注解,这样在子类中也能够成功被注入。这个父类也可以声明成抽象类。
public class ParentBean {
@Autowired
private OtherBean otherBean;
public OtherBean getOtherBean() {
return otherBean;
}
public void setOtherBean(OtherBean otherBean) {
this.otherBean = otherBean;
}
}
子类如下,其并没有声明任何属性,但是能够注入OtherBean这个属性。
@Component
public class SubBean extends ParentBean {
}
这两种方式在实际的开发过程中都会用到哦,希望小伙伴们都能领会并加以应用。
以上就是关于BeanDefinition的继承的一些分享,感谢小伙伴们的关注,欢迎留言哦。
网友评论