Spring Bean的继承
2023-09-14 09:03:08 时间
bean 定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等。
子 bean 的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或者添加其他值。
Spring Bean 定义的继承与 Java 类的继承无关,但是继承的概念是一样的。你可以定义一个父 bean 的定义作为模板和其他子 bean 就可以从父 bean 中继承所需的配置。
当你使用基于 XML 的配置元数据时,通过使用父属性,指定父 bean 作为该属性的值来表明子 bean 的定义。
看个例子:
创建一个POJO,包含两个属性message1和message2.
package com.sap;
public class HelloWorld {
private String message1;
private String message2;
public void setMessage1(String message){
this.message1 = message;
}
public void setMessage2(String message){
this.message2 = message;
}
public void getMessage1(){
System.out.println("World Message1 : " + message1);
}
public void getMessage2(){
System.out.println("World Message2 : " + message2);
}
}
再创建一个HelloIndia, 这个类和HelloWorld没有任何继承关系上的关联:
public class HelloIndia {
private String message1;
private String message2;
private String message3;
public void setMessage1(String message){
this.message1 = message;
}
public void setMessage2(String message){
this.message2 = message;
}
public void setMessage3(String message){
this.message3 = message;
}
public void getMessage1(){
System.out.println("India Message1 : " + message1);
}
public void getMessage2(){
System.out.println("India Message2 : " + message2);
}
public void getMessage3(){
System.out.println("India Message3 : " + message3);
}
}
bean.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="helloWorldJerry" class="com.sap.HelloWorld">
<property name="message1" value="Hello World!"/>
<property name="message2" value="Hello Second World!"/>
</bean>
<bean id="helloIndia" class="com.sap.HelloIndia" parent="helloWorldJerry">
<property name="message1" value="Hello India!"/>
<property name="message3" value="Namaste India!"/>
</bean>
</beans>
HelloWorld通过beans.xml注入了属性message1和message2,HelloIndia注入了属性message1和message3:
MainApp.java:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorldJerry");
objA.getMessage1();
objA.getMessage2();
HelloIndia objB = (HelloIndia) context.getBean("helloIndia");
objB.getMessage1();
objB.getMessage2();
objB.getMessage3();
}
}
输出:
World Message1 : Hello World!
World Message2 : Hello Second World!
India Message1 : Hello India!
India Message2 : Hello Second World!
India Message3 : Namaste India!
我们可以观察到,对于helloIndia,虽然我们没有在beans.xml里注入属性message2,但其仍然从parent bean即helloworld里继承了message2的属性值。
bean的parent除了是另一个bean外,也可以是一个模板(template),比如:
<bean id="beanTeamplate" abstract="true">
<property name="message1" value="Hello World!"/>
<property name="message2" value="Hello Second World!"/>
<property name="message3" value="Namaste India!"/>
</bean>
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关文章
- Spring学习笔记(五)——JdbcTemplate和spring中声明式事务
- Spring 全家桶之 Spring Web MVC(二)- Restful
- Spring batch教程 之 spring batch简介
- Spring框架:第六章:注解功能
- Spring Cloud OpenFeign调用流程
- spring官方文档 中文_Spring软件
- spring-boot-starter-mail 的简单使用
- Java框架Spring入门-第一个spring项目
- Spring循环依赖-spring源码详解(四)
- 谈谈你对Spring MVC中的九大组件的理解
- SpringBoot:模块探究之spring-boot-cli
- Spring:基于注解管理bean
- Mybatis是如何向Spring注册Mapper的?
- Spring Boot中使用MongoDB数据库的方法
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例详解编程语言
- Spring Boot(十三):spring boot小技巧详解编程语言
- Spring框架致力于搭建基于MSSQL的稳健开发体系(spring mssql)
- struts2+spring+hibernate分页代码[比较多]
- Spring实现文件上传(示例代码)