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甚至能够不用映射到某一个具体的类,而仅仅将其当作属性模板来使用。
文章持续更新中,欢迎关注个人公众号留言交流。