Spring学习笔记5 - Bean定义继承

bean定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息。

例如初始化方法,静态工厂方法名等等。

子bean的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或添加其他值(与Java类的继承概念一致)。

当使用基于XML的配置元数据时,通过使用父属性,指定父bean作为该属性的值来表明子bean的定义。

示例:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd">
 6
 7     <bean id="helloWorld" class="com.microyum.HelloWorldExtend">
 8         <property name="message1" value="Hello First World" />
 9         <property name="message2" value="Hello Second World" />
10     </bean>
11
12     <bean id="helloIndia" class="com.microyum.HelloIndiaExtend" parent="helloWorld">
13         <property name="message1" value="Hello First India" />
14         <property name="message3" value="Hello Third India" />
15     </bean>
16 </beans>

beanExtend.xml

 1 public class HelloWorldExtend {
 2     private String message1;
 3     private String message2;
 4
 5     public void getMessage1() {
 6         System.out.println("World Message1:" + message1);
 7     }
 8
 9     public void setMessage1(String message1) {
10         this.message1 = message1;
11     }
12
13     public void getMessage2() {
14         System.out.println("World Message2:" + message2);
15     }
16
17     public void setMessage2(String message2) {
18         this.message2 = message2;
19     }
20
21 }

HelloWorldExtend.java

 1 public class HelloIndiaExtend {
 2     private String message1;
 3     private String message2;
 4     private String message3;
 5
 6     public void getMessage1() {
 7         System.out.println("India Message1: " + message1);
 8     }
 9
10     public void setMessage1(String message1) {
11         this.message1 = message1;
12     }
13
14     public void getMessage2() {
15         System.out.println("India Message2: " + message2);
16     }
17
18     public void setMessage2(String message2) {
19         this.message2 = message2;
20     }
21
22     public void getMessage3() {
23         System.out.println("India Message3: " + message3);
24     }
25
26     public void setMessage3(String message3) {
27         this.message3 = message3;
28     }
29
30 }

HelloIndiaExtend.java

 1 import org.springframework.context.ApplicationContext;
 2 import org.springframework.context.support.ClassPathXmlApplicationContext;
 3
 4 public class MainAppExtend {
 5     public static void main(String[] args) {
 6         ApplicationContext context = new ClassPathXmlApplicationContext(
 7                 "beanExtend.xml");
 8
 9         HelloWorldExtend objA = (HelloWorldExtend) context
10                 .getBean("helloWorld");
11         objA.getMessage1();
12         objA.getMessage2();
13
14         HelloIndiaExtend objB = (HelloIndiaExtend) context
15                 .getBean("helloIndia");
16         objB.getMessage1();
17         objB.getMessage2();
18         objB.getMessage3();
19     }
20 }

MainAppExtend.java

输出结果:

World Message1:Hello First World
World Message2:Hello Second World
India Message1: Hello First India
India Message2: Hello Second World
India Message3: Hello Third India

这里可以观察到,在beanExtend.xml文件中,创建"helloIndia"bean的同时并没有传递message2,但由于Bean定义了继承,所有这里传递了message2

Bean定义模板

你可以创建一个Bean定义模板,不需要花太多功夫它就可以被其他子bean定义使用。

在定义一个Bean定义模板时,你不应该指定类的属性,而应该指定带true值的抽象属性

如下所示:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd">
 6
 7     <bean id="beanTemplate" abstract="true">
 8         <property name="message1" value="Hello World" />
 9         <property name="message2" value="Hello Second World" />
10         <property name="message3" value="Namaste India" />
11     </bean>
12
13     <bean id="helloIndia" class="com.microyum.HelloIndiaExtend" parent="beanTemplate">
14         <property name="message1" value="Hello India" />
15         <property name="message3" value="Namaste India" />
16     </bean>
17 </beans>

beanTemplate.xml

父bean自身不能被实例化,因为它是不完整的,而且它也被明确地标记为抽象的。

当一个定义是抽象的,它仅仅作为一个纯粹的模板bean定义来使用,充当子定义的父定义使用。

示例:

 1 public class MainAppExtend {
 2     public static void main(String[] args) {
 3         ApplicationContext context = new ClassPathXmlApplicationContext(
 4                 "beanTemplate.xml");
 5
 6         // HelloWorldExtend objA = (HelloWorldExtend) context
 7         // .getBean("helloWorld");
 8         // objA.getMessage1();
 9         // objA.getMessage2();
10
11         HelloIndiaExtend objB = (HelloIndiaExtend) context
12                 .getBean("helloIndia");
13         objB.getMessage1();
14         objB.getMessage2();
15         objB.getMessage3();
16     }
17 }

MainAppExtend.java

输出结果:

India Message1: Hello India
India Message2: Hello Second World
India Message3: Namaste India

时间: 2024-11-06 04:47:56

Spring学习笔记5 - Bean定义继承的相关文章

Spring学习笔记2 - Bean

Bean是一个被实例化.组装,并通过Spring IoC容器所管理的对象. Bean定义的属性 属性 描述 class 这个属性是强制性的,并且制定用来创建bean的bean类 name 这个属性指定唯一的bean标识符.在基于XML的配置元数据中,可以使用ID和/或name属性来制定bean标识符 scope 指定由特定的bean定义创建的对象的作用域 constructor-arg 用来注入依赖关系 properties 用来注入依赖关系 autowiring mode 用来注入依赖关系 l

Spring学习笔记——02 Bean的命名及实例化

一.Bean的命名 前一篇讲到IoC是一个管理Bean的容器,Bean多数情况下都是通过XML文件进行配置的,其中Bean的命名有以下几种方式,现在梳理一下. 1. 不指定id,只配置类名 <bean class="com.erving.HelloImpl"></bean> 若要调用该Bean,需要用以下语句: HelloApi helloApi = context.getBean(HelloApi.class); 2. 指定id,且id必须在IoC容器中唯一

Spring学习笔记之bean配置

1.命名bean 每个bean都有一个或者多个的的标识符.这些标识符必须在加载他们的容器里边唯一.一个bean经常有且只有一个标识符,但是如果需要超过一个的名字,可以考虑额外的别名. 基于xml的配置源文件,你可以使用id或者name属性去指定bean的标识符,这里有个问题,如果是名字和ID的不一致,内部又是如何处理的? 如果你不想再另外再给他们定义一个别名,你可以指定name属性,利用逗号(,),分号(;)或者空格.spring3.1以前id属性是xsd:ID类型的,这个是唯一的,3.1以后,

Spring学习笔记--注入Bean属性

这里通过一个MoonlightPoet类来演示了注入Bean属性property的效果. package com.moonlit.myspring; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.springframework.context.ApplicationContext; import org.springframework.context.support.Clas

Spring学习笔记3 - Bean的生命周期

当一个bean被实例化时,它可能需要执行一些初始化使它转换成可用状态. 当bean不再需要,并且从容器中移除是,可能需要做一些清除工作. 为了定义安装和拆卸一个bean,我们只要声明带有init-method和/或destroy-method参数 init-method属性指定一个方法,在实例化bean时,立即调用该方法. destroy-method指定一个方法,只有从容器中移除bean之后,才能调用该方法. 示例: beans.xml <?xml version="1.0"

Spring学习笔记之Bean的实例化

一.bean的实例化方法有3种, 1.构造器实例化 2.静态工厂方法实例化 3.实例工厂方法实例化 二.用构造器来实例化 <bean id="ShunDao" class="test.FTPDAO"  > id或者name用于指定bean的名称,class用于指定bean的类型 三.静态工厂方法实例化 <bean id="ShunDao" class="test.FTPDAO" factory-method=

Spring学习笔记之Bean的一些属性设置

1.beans 里边配置default-init-method="shunge",有这个方法的会执行,没有也不会报错 2.beans 里边配置default-destroy-method="shun88",这个只适用于单例模式,而且只在容器销毁的时候被调用 3.lazy-init="true" 可以在容器初始化的时候不加载,随用随加载,不使用不加载 4.depends-on="wait" 和ant里边的依赖都一样,多个用逗号分

[Spring Data Repositories]学习笔记--定义自己的repository

有时,我们会需要用到自己定义的一些查询方法,可以按照下面几步进行. 1. 定义一个包含该方法的接口 Interface UserRepositoryCustom { public void someCustomMethod(User user); } 2. 定义实现 class UserRepositoryImpl implements UserRepositoryCustom { public void someCustomMethod(User user){ //Your custom im

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;