Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring-bean之间的关系

Spring-bean之间的关系

作者头像
小小工匠
发布于 2021-08-16 08:34:31
发布于 2021-08-16 08:34:31
39400
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数:0
代码可运行

概述

不但可以通过引用另外一个bean,建立起Bean和Bean之间的依赖关系, bean元素标签之间也可以建立类似的关系,完成一些特殊的功能。

在Spring容器中,两个Bean之间 除了注入关系外,还存在 继承、依赖、引用 三种关系:

  • 继承关系:在Spring容器当中允许使用abstract标签来定义一个父bean,parent标签来定义一个子bean。子bean将自动继承父bean的配置信息。
  • 依赖关系:Spring允许用户通过depends-on标签来设定bean的前置依赖bean,前置依赖的bean会在本bean实例化之前创建好,供本bean使用。
  • 引用关系:不光可以通过ref标签来引用其他的bean,而且可以通过idref标签来引用其他bean的名字。它的主要作用是:在Spring容器启动的时候就可以检查引用关系的正确性,从而可以提前发现配置信息是否存在错误。

继承

如果多个bean存在相同的配置信息,Spring允许定义一个父Bean,子bean将自动继承父bean的配置信息。

Spring会将父bean的配置信息传递个子bean,如果子bean提供了父bean已有的配置信息,那么子bean的配置信息将覆盖父bean的配置信息。

父bean的功能主要是简化子bean的配置,所以一般声明为 abstract=”true”, 标识这个bean不会被实例化为一个对应的bean。

实例

POJO

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.extend;

public class Plane {

    private String brand;
    private String color;
    private int speed;

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public void introduce() {
        System.out.println("brand:" + brand + ",speed:" + speed + ",color:"
                + color);
    }
}

配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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 id="abstractPlane" class="com.xgj.ioc.beansRelation.extend.Plane" abstract="true"
        p:brand="F35" p:speed="1200" p:color="default"/>

     <bean id="planeOne" parent="abstractPlane" 
        p:color="white"/>

     <bean id="planeTwo" parent="abstractPlane" 
        p:color="blue"/>

beans>

测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.extend;

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

public class BeansExtendTest {

    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/xgj/ioc/beansRelation/extend/beans.xml");

        ctx.getBean("planeOne", Plane.class).introduce();
        ctx.getBean("planeTwo", Plane.class).introduce();
    }

}

运行结果

可以看到这两个bean都继承自abstractPlane这个父bean,在上面的代码中子bean就只改变了color属性,其他属性都跟父类相同。


依赖

在Spring容器中,当使用depends-on标签建立对其他Bean的依赖关系时,Spring容器负责管理这些Bean的关系,当实例化一个Bean时,容器保证该Bean所依赖的Bean已经初始化;如果前置依赖多个Bean,可以通过逗号或空格方式配置Bean名称。

实例

举个例子:

在某论坛系统当中,具有很多的启动参数,比如:会话过期时间、缓存更新时间等。这些启动参数用来控制系统的运行逻辑,我们使用一个SystemSetting类来表示这些参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.depend;

public class SystemSetting {

    public static int SESSION_TIMEOUT = 30;
    public static int REFRESH_CYCLE = 60;

}

在这里我们定义了两个系统参数,我们这里直接定义了这两个参数的值,但在真正的论坛系统当中这些值应该是可以动态设置的,并及时保存到后台数据库当中。在系统启动时,初始化程序来从后台数据库获取这些系统参数的配置值以覆盖默认的值。 在这里我们模拟从数据库中加载系统值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.depend;

public class SysInit {

    public SysInit() {
        SystemSetting.SESSION_TIMEOUT = 10;
        SystemSetting.REFRESH_CYCLE = 100;
    }

}

假设我们的系统需要一个缓存刷新管理器,他需要根据SystemSettings.REFRESH_CYCLE 的值来创建缓存定时刷新任务,那么请看如下 的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.depend;

import java.util.Timer;
import java.util.TimerTask;

public class CacheManager {

    public CacheManager() {
        Timer timer = new Timer();
        TimerTask cacheTask = new CacheTask();

        System.out.println("SystemSetting.REFRESH_CYCLE:"
                + SystemSetting.REFRESH_CYCLE);

        timer.schedule(cacheTask, 0, SystemSetting.REFRESH_CYCLE);
    }

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.depend;

import java.util.TimerTask;

public class CacheTask extends TimerTask {

    @Override
    public void run() {
        try {
            // bussiness logic
            System.out.println("bussiness run");
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

从上面的代码中可以看出 CacheManager依赖与SystemSetting,而SystemSetting又依赖与SysInit。 可以看到SysInit必须首先执行然后才能执行接下来的代码。 如果这三个bean都在Spring当中定义,那么我们该如何保证SysInit bean被首先执行呢? 那么就得使用depends-on属性标签了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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.xsd">


    <bean id="cacheManager" class="com.xgj.ioc.beansRelation.depend.CacheManager"
        depends-on="sysInit"/>

    <bean id="sysInit" class="com.xgj.ioc.beansRelation.depend.SysInit"/>
beans>

测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.depend;

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

public class BeansDependTest {

    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/xgj/ioc/beansRelation/depend/beans.xml");

    }
}

运行结果


引用

在Spring容器中,当使用标签引用另外一个Bean时,但实际上两者并没有建立引用关系,即使我们编写错误,也需要在运行期才可以发现。 因此Spring提供了元素标签,通过引用另一个Bean的名字,可以在容器启动的时候,检查引用关系的正确性,这样可以提前发现错误的配置信息

实例

POJO

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.reference;

public class Pilot {

    private String planeId;

    public String getPlaneId() {
        return planeId;
    }

    public void setPlaneId(String planeId) {
        this.planeId = planeId;
    }

    @Override
    public String toString() {
        System.out.println("*********" + getPlaneId());
        return "planeId:" + getPlaneId();
    }
}

POJO

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.reference;

public class Plane {

}

配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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 id="pilot" class="com.xgj.ioc.beansRelation.reference.Pilot" >
       <property name="planeId" >
          <idref bean="plane"/>
       property>
    bean>

    <bean id="plane" class="com.xgj.ioc.beansRelation.reference.Plane"/>

beans>

测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.beansRelation.reference;

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

public class BeansRefTest {

    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/xgj/ioc/beansRelation/reference/beans.xml");

        Pilot pilot = ctx.getBean("pilot", Pilot.class);
        pilot.setPlaneId("99");
        pilot.toString();
    }
}

运行结果


总结

Spring为bean提供了一系列的关系:注入、继承、依赖、引用 使用bean之间的关系可以将代码中繁琐的类间关系转移到配置文件当中来,降低了代码的耦合性,也方便系统的模块化管理。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/08/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring-BeanFactory解读
Spring通过一个配置文件描述Bean和Bean之间的依赖关系,利用Java反射功能实例化Bean,并建立Bean之间的依赖关系。
小小工匠
2021/08/16
2130
Spring-注入参数详解-[字面值及引用其他Bean]
在Spring配置文件中,不但可以将String、int等字面值注入bean中,还可以将集合、map等类型的数据注入Bean中, 此外还可以注入配置文件中其他定义的Bean.
小小工匠
2021/08/16
5260
Spring-基于注解的配置[02自动装载bean]
@Autowired默认按照类型(byType)匹配的方式在容器中查找匹配的Bean,当且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
小小工匠
2021/08/16
4610
Spring-方法注入lookup、方法替换MethodReplacer接口
无状态Bean的作用域一般可以配置为singleton(单例模式),如果我们往singleton的Pilot类中注入prototype的Plane类,并希望每次调用Pilot的getPlane()方法都能返回一个新的plane Bean ,该怎么办呢?
小小工匠
2021/08/16
4660
Spring-基于注解的配置[01定义Bean+扫描Bean]
不管是XML还是注解,他们都是在表达Bean定义的载体,其实质都是为Spring容器提供Bean定义的信息,在表现形式上都是将XML定义的内容通过类注解进行描述。
小小工匠
2021/08/16
6600
Spring-注入参数详解-[简化配置方式]
Spring为字面值、引用Bean和集合都提供了简化的配置方式,如果没有用到完整格式的特殊功能,大可使用简化的配置方式。
小小工匠
2021/08/16
2780
Spring-Spring配置概述
Spring启动时,读取应用程序提供的Bean配置信息,并在Spring容器中提供一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。
小小工匠
2021/08/16
3750
Spring-依赖注入
此外Spring还支持工厂方法注入。 这篇博文我们将了解到不同注入方式的具体配置方法。
小小工匠
2021/08/16
5400
Spring-Bean的作用域
在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域。
小小工匠
2021/08/16
3210
Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配
  Spring提供了配置信息的继承机制,可以通过为<bean>元素指定parent值重用已有的<bean>元素的配置信息。
Rekent
2018/09/04
4970
Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配
Spring-注入参数详解-[集合类型属性]
java.util包中的集合类型是最常用的结构数据类型,主要包括List、Set、Map、Properties。
小小工匠
2021/08/16
4150
深入浅出Spring IOC(二)
上一篇文章 深入浅出Spring IOC(一)我们介绍了Spring的IOC,即控制反转,Spring来创建对象,程序中需要使用对象时,直接通过Spring容器来获取对象,并通过DI完成对象之间的注入关系。今天我们继续来学习IOC的相关知识。
用户1260737
2019/10/14
4040
深入浅出Spring IOC(二)
Spring IoC容器与Bean管理
从本节开始,我将要学习作为java高级阶段最最最最重要的一个框架体系,名为Spring。Spring是整个Java生态中最重要的一环。因为我也是初学,所以我的概括也不一定全面和精炼。写这一章只是为自己以后复习。
害恶细君
2022/11/22
7350
Spring IoC容器与Bean管理
Spring-注入参数详解-[通过util命名空间简化集合类型的配置]
如果希望配置一个集合类型的Bean,而非一个集合类型的属性,则可以通过util命名空间进行配置。
小小工匠
2021/08/16
4770
Spring 框架学习(三)---- IOC创建对象
  写完了第一个Spring的程序,相信已经对spring已经有所了解了,那么我们这节来了解一下,IOC是如何创建对象,什么时候创建对象的。
RAIN7
2022/06/27
4250
Spring 框架学习(三)---- IOC创建对象
Bean的生命周期
Bean 的生命周期从Spring容器着手实例化Bean开始,直到最终销毁Bean,这当中经过了许多关键点,每个关键点都涉及特定方法的调用,可以将这些方法大致划分为3类:
java干货
2021/02/17
5950
Bean的生命周期
Spring Cache-缓存概述及使用
伴随信息量的爆炸式增长以及构建的应用系统越来越多样化、复杂化,特别是企业级应用互联网化的趋势,缓存(Cache)对应用程序性能的优化变的越来越重要。 将所需服务请求的数据放在缓存中,既可以提高应用程序的访问效率,又可以减少数据库服务器的压力,从而让用户获得更好的用户体验。
小小工匠
2021/08/17
6.1K0
Spring快速入门
最近几天一直在忙着学习数据结构和算法,关于JavaEE的框架也有一阵子没更新了。那么今天就来聊一聊Spring框架吧,针对该框架写一篇快速入门的文章。
wangweijun
2020/02/14
4610
spring之bean之间的关系
当然,我们也可以使用abstract来表明一个Bean是一个抽象bean。抽象bean可以作为一个模板,且不能被实例化。同时,如果一个bean没有声明class,那么该bean也是一个抽象bean,且必须指定abstract="true"。
西西嘛呦
2020/08/26
4490
spring之bean之间的关系
Spring-基于Java类的配置
JavaConfig是Spring的一个子项目,它旨在通过Java类的方式提供Bean的定义信息,在Spring4.0的版本,JavaConfig正式成为Spring4.0的核心功能。
小小工匠
2021/08/16
6120
相关推荐
Spring-BeanFactory解读
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验