【Spring源碼解讀】bean標籤中的屬性(二)你可能還不夠了解的 abstract 屬性和 parent 屬性

abstract 屬性說明

abstract 在java的語義裏是表明抽象的意思,用來講明被修飾的類是抽象類。在Spring中bean標籤裏的 abstract 的含義其實也差很少,表示當前bean是一個抽象的bean,從而不會爲它生成實例化對象。java

聲明一個bean,可是又不讓它實例化???spring

莫方,存在即合理,abstract 屬性存在一定有其存在的意義,且聽我慢慢道來。測試

parent 屬性說明

在此以前,咱們先說一下另外一個屬性: parent ,顧名思義,就是一個認爸爸的屬性,用來代表當前的bean的老爸是誰,這樣就能順利的繼承它的遺產。。。emmm,說錯了,繼承它的屬性。就像這樣:3d

<bean id="abstractBean" class="com.frank.spring.bean.parent.ParentBean" abstract="true">
    <property name="name" value="Frank" />
    <property name="age" value="18" />
</bean>

<bean id="childBean" class="com.frank.spring.bean.parent.ChildBean" parent="abstractBean">
    <property name="name" value="son"/>
    <property name="height" value="180"/>
</bean>

這樣咱們就有了一個父bean和一個子bean,在childBean中,咱們只設置了name和height屬性,但因爲在xml文件中,經過parent屬性給它安排了一個老爸是abstractBean,因此默認會繼承它的age屬性的值,也就是18。在子bean中,能夠覆蓋父bean中的屬性,好比這裏的name,在childBean中就從新設置了值。code

來測試一下:xml

@Test
public void testAbstract() {
    ApplicationContext context = new ClassPathXmlApplicationContext("test-bean.xml");
    ChildBean childBean = (ChildBean) context.getBean("childBean");
    Assert.assertEquals(childBean.getName(), "son");
    Assert.assertEquals(childBean.getAge(), Integer.valueOf(18));
    Assert.assertEquals(childBean.getHeight(), Integer.valueOf(180));
}

如下是ParentBean和ChildBean的定義:對象

public class ParentBean {
    private String name;
    private Integer age;

    //省略getter和setter方法
}

public class ChildBean {
    private String name;
    private Integer age;
    private Integer height;

    //省略getter和setter方法
}

聰明的你必定發現了,這兩個類並不必定要有實際的繼承關係,能夠是兩個普通的類。甚至,parent屬性所指向的bean能夠不用設置某個具體的類,而只設置它是屬性,就像這樣:blog

<bean id="abstractParent" abstract="true">
    <property name="name" value="Frank" />
    <property name="age" value="18" />
</bean>

<bean id="testChild" class="com.frank.spring.bean.parent.ChildBean" parent="abstractParent">
    <property name="name" value="son"/>
    <property name="height" value="180"/>
</bean>
@Test
public void testAbstractParent() {
    ApplicationContext context = new ClassPathXmlApplicationContext("test-bean.xml");
    ChildBean childBean = (ChildBean) context.getBean("testChild");
    Assert.assertEquals(childBean.getName(), "son");
    Assert.assertEquals(childBean.getAge(), Integer.valueOf(18));
    Assert.assertEquals(childBean.getHeight(), Integer.valueOf(180));
}

能夠看到此次咱們設置的abstractParent並無爲其指定類名,咱們也能將它作爲parent屬性的值。繼承

abstract 屬性的做用

在Spring中, abstract 屬性通常是用來聲明抽象bean,將一些公共的屬性放到一塊,這樣就能減小重複的代碼。因此在標籤中,能夠這樣設置:get

<bean id="abstractBean" class="com.frank.spring.bean.parent.ParentBean" abstract="true">
    <property name="name" value="Frank" />
    <property name="age" value="18" />
</bean>

<bean id="childA" class="com.frank.spring.bean.parent.ChildBean" parent="abstractBean">
    <property name="name" value="GG"/>
    <property name="height" value="180"/>
</bean>

<bean id="childB" class="com.frank.spring.bean.parent.ChildBean" parent="abstractBean">
    <property name="name" value="DD"/>
    <property name="height" value="185"/>
</bean>

這樣,abstractBean就起到了一個模板的做用,能夠減小重複定義,這裏只有簡單的幾個屬性,因此可能看起來不是很直觀,能夠想象一下,若是abstractBean中有一二十個公用屬性,是否是能夠少寫很多代碼呢?

總結

abstractparent 屬性能夠當作用來減小xml重複代碼的方法,能夠將一些bean的公共屬性抽取出來,放到一個公共的bean中,而後使用上面的栗子進行配置,來讓xml文件更加簡潔。

值得注意的是,parent屬性配置的bean之間,並不必定須要有實際的繼承關係,更多的是屬性的繼承。被設置爲parent的bean甚至能夠不用映射到某一個具體的類,而僅僅將其當作屬性模板來使用。

文章持續更新中,歡迎關注個人公衆號留言交流。

相關文章
相關標籤/搜索