`

Spring中depends-on的作用是什么?

阅读更多

spring的IOC容器负责bean的管理,当实例化一个bean是,spring保证该Bean所依赖的其他bean已经初始化。一般情况下,用<ref>元素建立对其他bean的依赖关系。

比如:

 

<bean id="a"   class="com.yanln.spring.bean.A">	</bean>
	
<bean id="b" class="com.yanln.spring.bean.B" p:a-ref="a"> </bean>

 

 但在某些情况下,这种bean之间的依赖关系并不那么明显。

举个例子:某个论坛系统拥有很多系统参数(如会话过期时间、缓存更新时间等),这些系统参数用于控制系统的运行逻辑。比如:

 

public class SystemSettings{
           //缓存更新时间
           public static int REFRESH_CYCLE = 60;
           ......
}

 

SystemSettings中为每一个系统参数提供了默认值,但对于一个灵活的论坛是需要提供一个管理后台的,在管理后台中可以调整这些系统参数并保存到后台数据库中,而在系统启动时,初始化程序从数据库后台加载这些系统参数的值来覆盖系统默认值。比如:

 

 

public class SystemInit{
          public SystemInit(){
                     //模拟从数据库中加载的系统参数配置值
                     SystemSettings.REFRESH_CYCLE=100;
                     ......
          }
}

 

假设论坛系统有一个缓存刷新管理器,它需要根据系统参数SystemSettings.REFRESH_CYCLE创建缓存刷新定时任务:

 

 

public class CacheManager{
          public CacheManager(){
                    Timer t = new Timer();
                    TimerTask cacheTask = new CacheTask();                    
                     //缓存刷新定时处理
                    t.schedule(cacheTask,0,SystemSettings.REFRESH_CYCLE);
          }
          ......
}

 

在以上的实例中,CacheManager类需要用到SystemSetting类的值,而SystemSettings的值有SystemInit负责初始化,虽然CacheManager不直接依赖SystemInit,但从逻辑上看,CacheManager希望在SystemInit加载并完成系统参数设置后再启动,以获得最新的系统参数值。如果这三个bean都在spring配置文件中定义,我们如何保证SystemInit在CacheManager之前进行初始化呢?

 

spring允许用户通过depends-on属性指定bean前置依赖的bean,前置依赖的bean会在本bean实例化之前创建好:

 

<bean id="sysinit" class="SystemInit">

<bean id="manager" class="CacheManager"  depends-on="sysinit"/>

 

如果前置依赖于多个 Bean,则可以通过分号,逗号或空格的方式配置 Bean 的名称。

1
0
分享到:
评论
1 楼 h702109382 2017-09-17  
讲得很清楚

相关推荐

    spring-asm-repack-4.0.jar

    spring 3.2.5版本源码使用的,构建的时候使用如下描述 因为英文不太好,大概意思可能是什么asm4.0版本使用的spring 在spring4中已经重新包装了asm在spring-core的核心包里,当然我这解释不标准 看下满原文构建的描述...

    spring-dm-reference

    ##### 为什么选择 Spring Dynamic Modules? - **统一的开发模型**:Spring DM 提供了一种统一的方式来管理和配置 OSGi 环境中的组件。 - **灵活的应用程序部署**:它支持多种部署选项,使得应用程序可以在不同的...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.3.4. 使用depends-on 3.3.5. 延迟初始化bean 3.3.6. 自动装配(autowire)协作者 3.3.6.1. 设置Bean使自动装配失效 3.3.7. 依赖检查 3.3.8. 方法注入 3.3.8.1. Lookup方法注入 3.3.8.2. 自定义方法的替代方案 3.4....

    spring-core.pdf

    - **1.4.3 使用`depends-on`**: 可以通过`depends-on`属性指定当前Bean依赖于其他Bean,确保依赖的Bean先被创建。 - **1.4.4 惰性初始化Bean**: 通过设置`lazy-init`属性为`true`,可以让Spring容器延迟创建Bean,...

    Spring Reference - Core Technologies.pdf

    Spring允许自定义作用域,开发者可以创建自己的作用域以及在自定义作用域中使用Bean。 1.6 自定义Bean的性质 Spring允许自定义Bean的生命周期回调、依赖以及作用域等。 1.6.1 生命周期回调 Spring管理Bean的生命...

    详解Spring 中如何控制2个bean中的初始化顺序

    Spring 中的 DependsOn 注解可以保证被依赖的 bean 先于当前 bean 被容器创建。例如,在 B 上加上注解 @DependsOn({"a"}),这样可以保证 A 先于 B 被初始化。 需要注意的是,bean 属性的注入是在初始化方法调用之前...

    spring-code-config-reference

    如`Configuration`、`Definition`、`DependsOn`、`Import`、`ImportResource`、`Lazy`和`Scope`属性,它们分别用于标记配置类、定义bean、指定依赖关系、导入其他配置、延迟加载和设置作用域等。 ### 示例应用程序 ...

    spring-reference.pdf

    - **Using depends-on**: 使用`depends-on`属性来指定Bean之间的依赖顺序。 - **Lazily-instantiated beans**: 延迟加载Bean,直到第一次请求时才初始化。 - **Autowiring collaborators**: 自动装配协作对象,简化...

    spring-3.1.0中文版api帮助文档

    - **depends-on属性**:确保某些Bean先于其他Bean初始化。 - **别名(Alias)**:创建Bean的别名,便于引用。 - **工厂Bean和工厂方法**:介绍如何使用工厂模式创建Bean。 - **命名空间**:简化属性注入的配置方式。 -...

    Spring5.0中文开发手册

    - 介绍了如何管理和配置Spring应用程序中的依赖关系,以及推荐的命名约定。 - **1.2.3.2 Logging 日志** - 描述了如何配置和使用日志框架与Spring一起工作。 #### 二、核心技术 ##### 3.1 Spring IoC容器和bean...

    spring-framework-reference-4.1.2

    Using depends-on ............................................................................................ 47 Lazy-initialized beans ...................................................................

    spring-reference

    Spring框架允许通过`depends-on`属性来指定一个Bean依赖于另一个Bean。这意味着,在创建依赖的Bean之前,必须先创建被依赖的Bean。 ##### 3.3.5 自动装配协作者 自动装配是一种方便的特性,允许Spring自动为Bean...

    spring3.1中文参考文档

    - 本章节进一步介绍了Spring 3.1版本中的新特性,包括但不限于对已有特性的优化和新增功能。 #### 第三部分:核心技术 ##### 第4章:IoC容器 **4.1 Spring IoC容器和bean的介绍** - 介绍了IoC容器的基本概念,...

    Spring Reference Core Technologies

    单例作用域是最常用的作用域之一,意味着在Spring IoC容器中只存在一个Bean实例。 - **1.5.2 原型作用域** 原型作用域意味着每次请求都会创建一个新的Bean实例。 - **1.5.3 单例Bean与原型Bean的依赖** 当...

    spring-framework-reference4.1.4

    Using depends-on ............................................................................................ 47 Lazy-initialized beans ...................................................................

Global site tag (gtag.js) - Google Analytics