`

Spring bean之间的关系:继承;依赖

 
阅读更多

继承Bean配置

  • Spring允许继承bean的配置 ,被继承的bean称为父bean,继承这个父Bean的Bean称为子Bean 
  • 子Bean从父Bean中继承配置,包括Bean的属性配置
  • 子Bean也可以  覆盖 从父Bean继承过来的配置 
  • 父Bean可以作为配置模版,也可以作为Bean实例,  若只想把父Bean作为模版,可以配置<bean>的abstract属性为true ,这样Spring将不会实例化这个Bean 
  • 并不是<bean>元素里的所有属性都会被继承 。比如:autowire,abstract等。  
  • 也  可以忽略父Bean的class属性 ,让子Bean指定自己的类,而共享相同的属性配置,但此时  abstract必须设为true

依赖Bean配置

  • Spring允许用户通过depends-on属性设定Bean前置依赖的Bean ,前置依赖的Bean会在本Bean实例化之前创建好 
  • 如果前置依赖于多个Bean,则可以通过逗号,空格或的方式配置Bean的名称
实例代码详解
package com.spring.auto.wire;

public class Department {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}


	@Override
	public String toString() {
		return "Department [name=" + name + "]";
	}

}
 
package com.spring.auto.wire;


public class Company {

	private String name;
	private Department  department;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Department getDepartment() {
		return department;
	}
	public void setDepartment(Department department) {
		this.department = department;
	}
	
	@Override
	public String toString() {
		return "Company [name=" + name + ", department=" + department + "]";
	}

	
}
 
package com.spring.auto.wire;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main_relation {

	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-relation.xml");
		
		Department department = (Department) ctx.getBean("department2");
		System.out.println(department);
		
		Company company = (Company) ctx.getBean("company");
		System.out.println(company);

		Company company1 = (Company) ctx.getBean("company1");
		System.out.println(company1);
		
		Company company2 = (Company) ctx.getBean("company2");
		System.out.println(company2);
	}

}
 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"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 抽象bean:bean的abstract属性为true的bean。这样bean不能被IOC容器实例化,只能用来被继承继承 
    若某一个bean的class属性没有指定,则该bean必须是一个抽象bean-->
<bean id="department1" p:name="JKY" abstract="true"></bean>

<!-- bean 配置的继承:使用bean 的parent 属性指定继承哪个baen的配置 -->
<bean id="department2" class="com.spring.auto.wire.Department" parent="department1"></bean>

<bean id="company" class="com.spring.auto.wire.Company" p:name="TT" p:department-ref="department2"></bean>

   <!-- 
    要求在配置company1时,必须有一个关联的department2!换句话说company这个bean依赖于department2这个bean. 
    注: 这里的依赖是指在实例化这个bean之前,必须实例化依赖的bean. 注意与ref的区别
   -->
<bean id="company1" class="com.spring.auto.wire.Company" p:name="TT1" depends-on="department2" p:department-ref="department2"></bean>

<bean id="company2" class="com.spring.auto.wire.Company" p:name="TT1" depends-on="company"></bean>

</beans>
 运行结果:

Department [name=JKY]

Company [name=TT, department=Department [name=JKY]]

Company [name=TT1, department=Department [name=JKY]]

Company [name=TT1, department=null]

 

 

 注意: depends-on 与 ref的区别,见:

http://stackoverflow.com/questions/12663491/ref-vs-depends-on-attributes-in-spring

 

分享到:
评论

相关推荐

    spring bean 属性总结

    - **depends-on属性**:指定Bean的依赖关系,确保某些Bean在其他Bean之前初始化。 #### `&lt;property&gt;`元素 `&lt;property&gt;`元素用于配置Bean的属性。它具有以下属性: - **name属性**:表示要设置的属性名称。 - **...

    详解Spring Bean 之间的特殊关系

    如果我们有多个Bean具有相似的配置信息,可以通过定义一个父Bean,让子Bean继承其配置。父Bean使用`abstract="true"`标记为抽象,以防止Spring容器尝试实例化它。例如: ```xml &lt;bean id="abstractBook" class=...

    Spring源码学习二:BeanDefinition解析1

    在Spring框架中,BeanDefinition是核心组件之一,它定义了bean的基本信息和元数据,包括bean的类、作用域、依赖关系、初始化方法等。在Spring容器启动时,配置文件或注解中的bean定义会被解析成BeanDefinition对象,...

    通过实例解析spring bean之间的关系

    抽象Bean不能单独被实例化,但它们的属性可以被子Bean继承。 二、Bean的依赖关系 依赖关系是指一个Bean需要另一个Bean的服务才能正常工作。Spring支持多种依赖注入(Dependency Injection, DI)方式,包括构造器...

    第七章 Spring4 继承、依赖、引用

    依赖注入是Spring框架的核心特性,它允许我们将对象之间的依赖关系外部化,而不是在对象内部硬编码。这样,我们可以通过配置来管理这些依赖,而不是通过new操作符来创建对象。Spring支持三种依赖注入方式: - **...

    SSH笔记-依赖、继承bean的配置

    在Spring框架中,依赖注入(Dependency Injection,DI)是核心特性之一,它使得对象之间的关系在编译时并不固定,而是在运行时动态地通过容器进行管理。这大大提高了代码的可测试性和可维护性。在Spring 4版本中,...

    Web项目中获取SpringBean与在非Spring组件中获取SpringBean.pdf

    总的来说,获取非Spring管理组件中的SpringBean主要有两种方式:一是通过实现`ApplicationContextAware`接口并存储ApplicationContext,二是使用注解和静态内部类来注入BeanFactory。这两种方法都是Spring框架提供的...

    Spring In Action 继承Bean的配置

    总之,Spring的Bean继承配置是一种强大的设计模式,它允许我们在多个Bean之间共享和重用配置,同时还能进行定制化。通过XML、源码分析以及合适的工具,我们可以更好地理解和利用这一特性,提高代码的可读性和可维护...

    spring入门教程之bean的继承与自动装配详解

    Spring作为一个依赖注入(DI)和面向切面编程(AOP)的容器,它管理Bean的生命周期并处理Bean之间的依赖关系。本文将深入探讨Spring Bean的继承与自动装配。 首先,让我们了解Bean的基本定义。在Spring配置文件中,...

    JAVA spring 系列案例50个和学习资料

    Spring系列第12篇:lazy-init:bean延迟初始化Spring系列第13篇:使用继承简化bean配置(abstract & parent)Spring系列第14篇:lookup-method和replaced-method比较陌生,怎么玩的?Spring系列第15篇:代理详解(Java...

    尚硅谷佟刚Spring4代码及PPT.rar

    代码及ppt涵盖 Spring4.0 的所有核心内容:在 Eclipse 中安装 SpringIDE 插件、IOC & DI、在 Spring 中配置 Bean、自动装配、Bean 之间的关系(依赖、继承)、Bean 的作用域、使用外部属性文件、SpEL、管理 Bean 的...

    获得spring里注册Bean的四种方法

    获取 Spring 里注册的 Bean 对象可以使用四种方法:继承 BaseDispatchAction、实现 BeanFactoryAware、使用 ApplicationContext、使用 @Autowired。每种方法都有其特点和应用场景,开发者可以根据实际情况选择合适的...

    spring的Bean配置说明

    6. `parent` 属性:允许一个Bean继承另一个Bean的配置,子Bean将继承父Bean的所有属性,除非被明确覆盖。 7. `autowire` 属性:控制Bean的自动装配。`no`表示不自动装配;`byName`是根据属性名匹配Bean;`byType`是...

    Spring源码学习三:BeanFactory解析1

    当我们通过XML、Java配置或者注解定义Bean时,Spring会将这些配置解析成BeanDefinition对象,BeanDefinition包含了Bean的所有元数据,如类名、依赖关系、初始化方法等。 BeanFactory接口定义了一系列方法,如: 1....

    Spring的Bean配置说明

    - **`depends-on`属性**:定义Bean之间的依赖关系,确保指定的Bean在当前Bean之前被初始化。 #### 三、`&lt;property&gt;`元素详解 - **功能概述**:`&lt;property&gt;`元素用于设置Bean的属性值,可以是简单的值、对其他Bean...

    谈谈我对Spring Bean 生命周期的理解

    "Spring Bean 生命周期详解" Spring Bean 生命周期是 Spring 框架中的一个核心概念,了解 Spring Bean 的生命周期对我们了解整个 Spring 框架会有很大的帮助。本文将详细介绍 Spring Bean 生命周期的概念、生命周期...

    spring自动扫描和管理Bean的示例

    除了自动扫描,Spring还提供了注解来管理Bean的生命周期和依赖注入。例如: - **@Autowired**:用于自动装配Bean的依赖。Spring会尝试根据类型或名称找到合适的Bean进行注入。 - **@Qualifier**:配合@Autowired...

    spring源代码分析:annotation支持的实现

    例如,`@Autowired`注解用于自动装配Bean,Spring通过反射找到合适的依赖并注入。 5. **Aspects and AOP(切面与面向切面编程)**: - Spring的AOP支持允许通过注解定义切面,如`@Aspect`、`@Before`、`@After`等...

Global site tag (gtag.js) - Google Analytics