- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Spring中bean的继承与抽象代码示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我们在应用Spring时,在一般的设计时,肯定要用的抽象类。那在Spring中怎么样配置这些抽象Bean呢。请看下面:
如果两个bean 之间的配置信息非常相似,可利用继承来减少重复配置工作.
继承是指子bean 定义可从父bean 定义继承部分配置信息,也可覆盖特定的配置信息,或者添加一些配置。使用继承配置可以节省很多的配置工作。在实际应用中,通用配置会被配置成模板,可供子bean 继承.
使用abstract 属性 。
正如前面所介绍的,通用的配置会被配置成模板,而模板不需要实例化,仅仅作为子bean 定义的模板使用。而ApplicationContext 默认预初始化所有的singleton bean 。使用abstract 属性,可以阻止模板bean 被预初始化。abstract 属性为true 的bean 称为抽象bean ,容器会忽略所有的抽象bean 定义,预初始化时不初始化抽象bean。如果没有定义abstract 属性,该属性默认为false 。如下配置文件定义了一个抽象bean ,该抽象bean 作为模板使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public
class
SteelAxe
implements
Axe
{
//count 是个状态值,每次执行chop 方法该值增加1
private
int
count =
0
;
public
SteelAxe(){
System.out.println(
"Spring实例化依赖bean: SteelAxe 实例.. ."
);
}
//测试用方法
public
String chop(){
return
"钢斧砍柴真快"
+ ++count;
}
}
public
class
Chinese
implements
Person
//面向Axe 接口编程,而不是具体的实现类
private
Axe axe;
//默认的构造器
public
Chinese(){
System.out.println(
"Spring实例化主调bean: Chinese 实例... "
);
}
//设值注入所需的setter 方法
public
void
setAxe( Axe axe){
System.out.pr工ntln (
" Spring 执行依赖关系注入..."
);
this
.axe = axe;
}
//实现Person 接口的useAxe 方法
public
void
useAxe(){
System.out.println(axe.chop());
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?
xml
version
=
"1.0"
encoding
=
"gb2312"
?>
<!一指定Spring 配置文件的dtd>
<
lDOCTYPE
beans PUBL工C "-//SPRING//DTD BEAN//EN"
''http://www.springframework.org/dtd/spring-beans.dtd''>
<!一Spring 配置文件的根元素一〉
<
beans
>
<
bean
id
=
"steelAxe"
class
=
"lee.SteelAxe"
/>
<!… 通过abstract 属性定义该bean 是抽象bean-->
<
bean
id
=
"chineseTemplate"
class
=
"lee.Chinese"
abstract
=
"true"
>
<!一定义依赖注入的属性一〉
<
property
name
=
"axe"
>
<
ref
local
=
"steelAxe"
/>
</
property
>
</
bean
>
</
beans
>
|
从配置文件中可以看出,抽象bean 的定义与普通bean 的定义几乎没有区别,仅仅增加abstract 属性为true ,但主程序执行结果却有显著的差别。下面的主程序采用AppliactionContext 作为Spring 容器, AppliationContext 默认预初始化所有的singleton bean。其主程序部分如下
1
2
3
4
5
6
7
|
public
class
BeanTest
{
public
static
void
main(String[] args)
throws
Exception{
ApplicationContext ctx =
new
FileSysternXmlApplicationContext(
"bean.xml"
);
}
}
//主程序部分仅仅实例化了ApplicationContext,在实例化ApplicationContext时,默认实例化singleton bean。
|
程序执行结果如下
Spring 实例化依赖bean: SteelAxe 实例.. . 。
容器并没有实例化chineseTemplate bean ,而忽略了所有声明为abstract 的beano 如果取消abstract 属性定义,则程序执行结果如下
Spring 实例化依赖bean: SteelAxe 实~J... 。
Spring 实例化主调bean: Chinese 实例.. . 。
Spring 执行依赖关系注入... 。
可以看出,抽象bean 是一个bean 模板,容器会忽略抽象bean 定义,因而不会实例化抽象bean。但抽象bean 无须实例化,因此可以没有class 属性。如下的配置文件也有效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?
xml
version
=
"1.0"
e口
coding
=
"gb2312"
?>
<!一指定Spring 配置文件的dtd>
<!DOCTYPE beans PUBLIC "-/!SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd''>
<! -- Spring 配置文件的根元素-->
<
beans
>
<
bean
id
=
"steelAxe"
class
=
"lee.SteelAxe"
/>
<!一通过abstract 属性定义该bean 是抽象bean,抽象bean 没有指定class 属性一〉
<
bean
id
=
"chineseTemplate"
abstract
=
"true"
>
<!… 定义依赖注入的属性一〉
<
property
name
=
"axe"
>
<
ref
local
=
"steelAxe"
/>
</
property
>
</
bean
〉
</beans>
|
注意:抽象bean 不能实例化,既不能通过getBean 获得抽象bean,也不能让其他bean 的ref 属性值指向抽象bean,因而只要企图实例化抽象bean,都将导致错误.
定义子bean 。
我们把指定了parent 属性值的bean 称为子bean; parent 指向子bean 的模板,称为父bean 。子bean 可以从父bean 继承实现类、构造器参数及属性值,也可以增加新的值。如果指定了init-method , destroy-method 和factory-method 的属性,则它们会覆盖父bean的定义。子bean 无法从父bean 继承如下属性: depends-on, autowire, dependency-check,singleton, lazy-init。这些属性将从子bean 定义中获得,或采用默认值。通过设置parent 属性来定义子bean , parent 属性值为父bean id。修改上面的配置文件如下,增加了子bean 定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?
xml
version
=
"1.0"
encoding
=
"gb2312"
?>
<!一指定Spring 配置文件的dtd>
<
lDOCTYPE
beans PUBL工C "-//SPRING//DTD BEAN//EN"
''http://www.springframework.org/dtd/spring-beans.dtd''>
<!-- Spring 配置文件的根元素一〉
<beans>
<bean id="steelAxe" class="lee.SteelAxe"/>
<!一通过abstract 属性定义该bean 是抽象bean-->
<
bean
id
=
"chineseTemplate"
class
=
"lee.Chinese"
abstract
=
"true"
>
<!-- 定义依赖注入的属性一〉
<
property
name
=
"axe"
>
<
ref
local
=
"steelAxe"
/>
</
property
>
</
bean
>
<!一通过parent 属性定义子bean ?
<
bean
id
=
"chinese"
parent
=
"chineseTemplate"
/>
</
beans
>
|
子bean 与普通bean 的定义并没有太大区别,仅仅增加了parent 属性。子bean 可以没有class 属性,若父bean 定义中有class 属性,则子bean 定义中可省略其class 属性,但子bean 将采用与父bean 相同的实现类.
测试程序修改如下:
1
2
3
4
5
6
7
8
|
public
class
BeanTest
{
public
static
void
main(String[] args)
throws
Exception{
ApplicationContext ctx =
new
FileSysternXmlApplicationContext(
"bean.xml"
);
Person p = (Person)ctx.getBean(
"chinese"
);
p.useAxe();
}
}
|
程序执行结果如下
Spring 实例化依赖bean: Stee1Axe 实例.. . 。
Spring实例化主调bean: Chinese 实例.. . 。
spring 执行依赖关系注入... 。
钢斧砍柴真快 。
另外,子bean 从父bean 定义继承了实现类并依赖bean 。但子bean 也可覆盖父bean的定义,看如下的配置文件
1
2
3
4
5
6
7
8
9
10
11
|
//Axe 的实现类StoneAxe如下:
public class StoneAxe implements Axe
//默认构造器
public StoneAxe(){
System.out.println("Spring实例化依赖bean: StoneAxe实例.. .");
}
//实现Axe 接口的chop 方法
public String chop(){
return "石斧砍柴好慢";
}
}
|
Chinese子类如下:
1
2
3
4
5
6
7
|
public
class
Shanghai
extends
Chinese {
public
void
show() {
System.out.println(
"子Bean ,中国的上海"
);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?
xm1
version
=
"1.0"
encoding
=
"gb2312"
?>
<! 指定Spring 配置文件的dtd>
<
lDOCTYPE
beans PUBLIC "-//SPRING//DTD BEAN//EN"
''http://www.springframework.org/dtd/spring-beans.dtd''>
<! -- Spring 配置文件的根元素一〉
<
beans
>
<
bean
id
=
"steelAxe"
class
=
"lee.SteelAxe"
/>
<
bean
id
=
"stoneAxe"
class
=
"lee.StoneAxe"
/>
<!一通过abstract 属性定义该bean 是抽象bean-->
<
bean
id
=
"chineseTemplate"
class
=
"lee.Chinese"
abstract
=
"true"
>
<
property
name
=
"axe"
>
<
ref
local
=
"steelAxe"
/>
</
property
>
</
bean
>
<!一通过parent 属性定义子bean-->
<
bean
id
=
"shanghai"
parent
=
"chineseTemplate"
>
<!一覆盖父bean 的依赖定义…〉
<
property
name
=
"axe"
>
<
ref
local
=
"stoneAxe"
/>
</
property
>
</
bean
>
</
beans
>
|
此时,子bean 的依赖不再是父bean 定义的依赖了。注意,这个时候的父类lee.Chinese 不能是抽象类,(说明下:有abstract="true")不一定说明这个类一定是个抽象类,不是抽象类同样可以在Spring里定义为抽象Bean,如果你的Class是抽象类,那这个时候就不能用父Bean的Class,一定要在子Bean中定义Class来初始化这个子Bean) 。
测试程序修改如下:
1
2
3
4
5
6
7
8
|
public
class
BeanTest
{
public
static
void
main(String[] args)
throws
Exception{
ApplicationContext ctx =
new
FileSysternXmlApplicationContext(
"bean.xml"
);
Person p = (Person)ctx.getBean(
"shanghai"
);
p.useAxe();
}
}
|
按上面的测试程序执行结果如下
Spring 实例化依赖bean: SteelAxe 实例.. . 。
spring 实例化依赖bean: StoneAxe 实例.. . 。
Spring 实例化主调bean: Chinese 实例.. . 。
Spring 执行依赖关系注入... 。
石斧砍柴好慢 。
注意:上例中的子bean 定义都没有class 属性,因为父bean 定义中已有class 属性,子bean 的class 属性可从父bean 定义中继承,但需要注意的是从父Bean继承Class时,父Bean一定不能是抽象类,因为抽象类不能创建实例;如果父bean 定义中也没有指定class 属性,则子bean 定义中必须指定class 属性,否则会出错;如果父bean 定义指定了class 属性,子bean 定义也指定了class 属性,则子bean 将定义的class 属性覆盖父bean 定义的class属性.
Spring 中bean的继承和Java中的继承截然不同,前者是实例与实例之间的参数的延续,后者是一般到特殊的细化,前者是对象和对象之间的关系,后者是类和类之间的关系.
a.Spring中的子bean和父bean可以是不同的类型,但是Java中的继承,子类是一种特殊的父类; 。
b.Spring中的bean的继承是实例之间的关系,主要表现在参数的延续,而Java中的继承是类与类之间的关系,主要体现在方法和属性的延续.
c.Spring中子bean不可以作为父bean使用,不具备多态性,Java中的子类实例完全可以当作父类实例使用.
总结 。
本文有关Spring中bean的继承与抽象代码示例的内容就到这里,希望对大家有所帮助。有兴趣的朋友可以参阅本站其他专题,精彩不断。感谢大家对本站的支持! 。
原文链接:http://langgufu.iteye.com/blog/1911615 。
最后此篇关于Spring中bean的继承与抽象代码示例的文章就讲到这里了,如果你想了解更多关于Spring中bean的继承与抽象代码示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对 java 中的抽象有点困惑。 我查了很多页面说抽象就是数据隐藏(隐藏实现)。 我对抽象的理解是它是“部分实现”。只需在抽象类/接口(interface)中定义您需要的内容,然后扩展/实现它们并添
我是 Ruby 的新手,主要来自 C# 和 ActionScript 3(以及其他语言)。我对抽象功能很好奇。具体来说,包装和抽象 Ruby 的 FTP 和 SFTP 库。 我四处搜索,发现了一个名为
目录 Java基础知识(抽象) 抽象 抽象定义 abstract的使用 定义抽象类
这个月我花了一些时间与 Emacs Lisp 进行斗争,试图获得更好地满足我需求的自动缩进。令人惊讶的是,大多数缩进代码是多么低级。我只看到了很少的抽象,例如 搜索不在字符串或注释中的第一个正则表达式
我有以下内容: public abstract class Foo{ //contents of Foo // ... public class Bar extends
我有三个类(class)(A 类、B 类和 C 类)。 类 A 调用 B 的实例并运行 start()。 B类扩展了Thread,因此当调用start()时,run()方法中的任何内容都会被执行。 在
这个问题已经有答案了: Calling a subclass method from superclass (5 个回答) 已关闭 7 年前。 Klasse1是一个抽象类,有一个 foo()方法。 K
我有一个这样的函数: def test(): x = "3" # In actual code, this is computed if x is None: retu
我有两个基类之间的关系: public abstract class RecruiterBase { // Properties declare here // Constructors de
这是我第一次发帖,但我遇到了很多问题。我目前有一个带有标题的 AbstractDevice 类: public abstract class AbstractDevice> implements De
我有一个 MotorDefinition 类和一个名为 Motor 的抽象类: class MotorDefinition { public: MotorDefinition(int p1,
是否有任何方法可以在这种代码(sass)中制定 css 的抽象规则: #cottage-image-gallery input:nth-of-type(1):checked ~ label:nth-o
是否可以声明一个已知的基类型并允许传输所有派生类型? [ServiceContract] public interface IService { [OperationContract]
我目前正在为基于 Java 的文本游戏开发角色生成机制,但我遇到了一个问题,看不出哪里出了问题。我有一个“Character”类,它是抽象的,然后是另一个类“NPCharacter”,它是建立在这个之
抱歉,标题令人困惑。不太确定如何表达它,这可能是问题所在! 我正在寻找一个好的抽象来用于涉及并发线程的情况。 我已经接近了,但还不是很清楚。 稍微简化一下,我在 Android 手机上收集了两种传感器
提前感谢您阅读本文。我不完全理解如何/何时使用摘要,所以我试图在我从事的每个项目中考虑它,看看它是否会在某一天全部点击 Smile | :) 此外,可访问性级别(私有(private)、 protec
我正在探索用于生成 Web 内容的 XML -> XSLT -> HTML 模因。我的 XSLT 经验很少。 我很好奇 XSLT 中有哪些机制可用于处理抽象或“重构”。 例如,使用通用 HTML 和服
在这些谈话中 Nicholas Zakas和 Addy Osmani他们讨论了在构建大型 Javascript 应用程序时将外观模式用作沙箱的想法,以便将应用程序与底层基础库分离。 这种解耦理论上允许
我使用C++和CUDA/C,想为特定问题编写代码,但遇到了一个非常棘手的简化问题。 我在并行编程方面的经验不容忽视,但相当有限,我无法完全预见到此问题的特殊性。 我怀疑是否有一种方便甚至“轻松”的方式
假设我有: trait A class B extends A class C extends A 有没有办法配置类型参数: class Foo[AType <: A with canCreateIn
我是一名优秀的程序员,十分优秀!