abstract
在java的語義裏是表明抽象的意思,用來講明被修飾的類是抽象類。在Spring中bean標籤裏的 abstract
的含義其實也差很少,表示當前bean是一個抽象的bean,從而不會爲它生成實例化對象。java
聲明一個bean,可是又不讓它實例化???spring
莫方,存在即合理,abstract
屬性存在一定有其存在的意義,且聽我慢慢道來。測試
在此以前,咱們先說一下另外一個屬性: 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
屬性的值。繼承
在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中有一二十個公用屬性,是否是能夠少寫很多代碼呢?
abstract
和 parent
屬性能夠當作用來減小xml重複代碼的方法,能夠將一些bean的公共屬性抽取出來,放到一個公共的bean中,而後使用上面的栗子進行配置,來讓xml文件更加簡潔。
值得注意的是,parent
屬性配置的bean之間,並不必定須要有實際的繼承關係,更多的是屬性的繼承。被設置爲parent
的bean甚至能夠不用映射到某一個具體的類,而僅僅將其當作屬性模板來使用。
文章持續更新中,歡迎關注個人公衆號留言交流。