abstract 属性说明

abstract 在java的语义里是代表抽象的意思,用来说明被修饰的类是抽象类。在Spring中bean标签里的 abstract 的含义其实也差不多,表示当前bean是一个抽象的bean,从而不会为它生成实例化对象。

声明一个bean,但是又不让它实例化???

莫方,存在即合理,abstract 属性存在必定有其存在的意义,且听我慢慢道来。

parent 属性说明

在此之前,我们先说一下另一个属性: parent ,顾名思义,就是一个认爸爸的属性,用来表明当前的bean的老爸是谁,这样就能顺利的继承它的遗产。。。emmm,说错了,继承它的属性。就像这样:

<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中就重新设置了值。

来测试一下:

@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可以不用设置某个具体的类,而只设置它是属性,就像这样:

<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,将一些公共的属性放到一块,这样就能减少重复的代码。所以在标签中,可以这样设置:

<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甚至可以不用映射到某一个具体的类,而仅仅将其当做属性模板来使用。

文章持续更新中,欢迎关注我的公众号留言交流。

【Spring源码解读】bean标签中的属性(二)你可能还不够了解的 abstract 属性和 parent 属性的更多相关文章

  1. 如何将spring源码导入到eclipse中

    如何将spring源码导入到eclipse中 1. 下载spring源码  可以在github官网中找到spring源码来下载,或者直接通过git下载,是一样的,这里演示 直接在github网站下载, ...

  2. 【Spring源码解读】bean标签中的属性

    说明 今天在阅读Spring源码的时候,发现在加载xml中的bean时,解析了很多标签,其中有常用的如:scope.autowire.lazy-init.init-method.destroy-met ...

  3. Spring源码解读之BeanFactoryPostProcessor的处理

    前言 前段时间旁听了某课堂两节Spring源码解析课,刚好最近自己又在重新学习中,便在这里记录一下学习所得.我之前写过一篇博文,是介绍BeanFactoryPostProcessor跟BeanPost ...

  4. Spring源码学习——自定义标签

    2019独角兽企业重金招聘Python工程师标准>>> 1.自定义标签步骤 创建一个需要扩展的组件 定义xsd文件描述组件内容 创建一个文件,实现BeanDefinitionPars ...

  5. Spring源码解读Spring IOC原理

    一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们自己设计这样一个视角来考虑: 所谓控制反转,就是把原先我们代码里面需要实现的对象创建.依赖的代码,反 ...

  6. Spring源码系列 — Bean生命周期

    前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...

  7. Spring源码解读--(一)源码下载

    走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...

  8. Spring源码解读:核心类DefaultListableBeanFactory的继承体系

    1 简介 我们常用的ClassPathXmlApplicationContext是AbstractRefreshableApplicationContext的子类,而DefaultListableBe ...

  9. Spring源码之Bean生命周期

    https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...

  10. Spring源码 21 Bean生命周期

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

随机推荐

  1. mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)

    1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...

  2. 你可能不知道的setInterval的坑

    你可能不知道的setInterval的坑 之前印象中一直记得setInterval有一些坑,但是一直不是很清楚那些坑是什么.今天去摸索了下之后,决定来做个记录以免自己忘记,也希望让更多人了解到这个坑. ...

  3. Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest

    Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePull ...

  4. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  5. 翻译:low_priority和high_priority(已提交到MariaDB官方手册)

    本文为mariadb官方手册:HIGH_PRIORITY and LOW_PRIORITY的译文. 原文:https://mariadb.com/kb/en/high_priority-and-low ...

  6. SpringBoot之打成war包部署到Tomcat

    正常情况下SpringBoot项目是以jar包的形式,正常情况下SpringBoot项目是以jar包的形式,并且SpringBoot是内嵌Tomcat服务器,所以每次重新启动都是用的新的Tomcat服 ...

  7. python模块之xml

    xml模块 xml结构 xml是种实现不同语言或程序之间进行数据交换的协议,跟json差不多,但没json使用简单.但是因为历史遗留问题,至今很多行业依然使用xml这种数据格式. xml的格式如下,是 ...

  8. python模块之pickle、shelve、json

    一 什么是序列化 序列化指的是将内存中的数据结构转化为一种中间格式,并存储到硬盘上. (反序列化:将硬盘上存储的中间格式数据再还原为内存中的数据结构) 二 为什么要序列化 持久保持状态 需知一个软件/ ...

  9. SpringBoot系列——WebSocket

    关于websocket的介绍与实现,我之前写过一篇博客,记录了用springboot-websocket实现了私聊.群聊的简单实例,这里就只提供一个入口,不再重复的写了,WebSocket+Java ...

  10. htmlUnit加持,网络小蜘蛛的超级进化

    前言 前段时间写了个小说线上采集阅读(猛戳这里:https://www.cnblogs.com/huanzi-qch/p/9817831.html),当我们去采集起点网的小说目录时发现目录数据没有在h ...