Spring内核研究-管理bean之间的关系一(depends-on)
depend-on用来表示一个Bean的实例化依靠另一个Bean先实例化。如果在一个bean A上定义了depend-on B那么就表示:A 实例化前先实例化 B。
这种情况下,A可能根本不需要持有一个B对象。
比如说,你的DAO Bean实例化之前你必须要先实例化Database Bean,DAO Bean并不需要持有一个Database Bean的实例。因为DAO的使用是依赖Database启动的,如果Database Bean不启动,那么DAO即使实例化也是不可用的。这种情况DAO对Database的依赖是不直接的。
除了在DAO上使用构造函数注入Database Bean以外,Spring没有任何依赖注入的关系能够满足上面的情况。但是DAO也许根本不需要Database的实例被注入,因为DAO是通过JDBC访问数据库的,它不需要调用Database 上的任何方法和属性。
在这种情况下你可以使用depends-on来定义在DAO被实例化之前先去实例化Database。你可这样定义:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="dao" class="research.spring.beanfactory.ch3.Dao" depends-on="database">
</bean>
<bean id="database" class="research.spring.beanfactory.ch3.Database">
</bean>
</beans>
通过定义depends-on=”database”可以控制Sping实例化dao的顺序。在任何时候Spring总会保证实例化DAO之前先实例Database。
通常depends-on常常应用在上面的场景中。如果DAO depend-on Database的同时需要得到Database的实例,那么使用构造函数注入是一个比较好的解决办法。因为构造函数注入的方式是要先实例化目标对象依赖的对象然后在实例化目标对象。关于构造函数的输入请参考另一篇文章《Spring内核研究-set方法注入和构造函数注入》
DAO depend-on Database时,也可以在DAO上定义setDatabase方法来接收一个Database的实例。这样Sping会保证DAO创建前先创建Database实例,然后在把实例化DAO后调用DAO的setDatabase方法把刚才创建的Database的实例注入给DAO。前提条件时Database必须定义成单例的。否则Spring在DAO depend-on Database时会创建一个Database的实例,在DAO.setDatabase时又会创建Database另外的一个实例。这种情况可能不是你想要的,而且很可能会造成比较隐蔽的错误。
使用set方法注入depend-on的对象:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="dao" class="research.spring.beanfactory.ch3.Dao" depends-on="database ">
<property name="database">
<ref bean="database"></ref>
</property>
</bean>
<bean id="database" class="research.spring.beanfactory.ch3.Database">
</bean>
</beans>
一般在depends-on一个对象并且又需要这个对象实例的情况下,我都建议你使用构造函数的注入方式替换depend-on。只有不能构造函数中添加依赖对象参数的情况下才使用上面例子里的方式。
可以同时使用depends-on和构造函数注入,如A depends-on B 并且 new A(B b)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="dao" class="research.spring.beanfactory.ch3.Dao" depends-on="database">
<constructor-arg>
<ref bean="database"></ref>
</constructor-arg>
</bean>
<bean id="database" class="research.spring.beanfactory.ch3.Database">
</bean>
</beans>
然而这种做法是不合适的,因为在构在函数中注入依赖对象的方式可以包含depends-on的情况。也就时说new A(B b)包含了A depends-on B的所有情况。既然已经定义了new A(B b)就没有必要在定义A depends-on B。所以,new A(B b)可以替代A depends-on B。在A创建前必须创建B,而且A不需要使用B实例的情况下只能使用A depends-on B。
Spring允许Bean和Bean依赖的Bean(合作者)上同时定义depends-on。比如A depends-on B && B depends-on C && C depends-on D。下面这样定义是合法的。Sping实例化他们的顺序是D->C->B->A。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="a" class="research.spring.beanfactory.ch3.A" depends-on="b" />
<bean name="b" class="research.spring.beanfactory.ch3.B" depends-on="c" />
<bean name="c" class="research.spring.beanfactory.ch3.C" depends-on="D" />
<bean name="d" class="research.spring.beanfactory.ch3.D" />
</beans>
但是Spring不允许A depends-on B && B depends-on A的情况。看下面的例子,由于D又依赖回A,这种在依赖关系中形成了一个闭环,Spring将无法处理这种依赖关系。所以下面的这种定义是不合法的。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="a" class="research.spring.beanfactory.ch3.A" depends-on="b" />
<bean name="b" class="research.spring.beanfactory.ch3.B" depends-on="c" />
<bean name="c" class="research.spring.beanfactory.ch3.C" depends-on="D" />
<bean name="d" class="research.spring.beanfactory.ch3.D" depends-on="A"/>
</beans>
一个Bean可以同时depends-on多个对象如,A depends-on D,C,B。可以使用“,”或“;”定义多个depends-on的对象。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="a" class="research.spring.beanfactory.ch3.A" depends-on="d,c,b" />
<bean name="b" class="research.spring.beanfactory.ch3.B" />
<bean name="c" class="research.spring.beanfactory.ch3.C" />
<bean name="d" class="research.spring.beanfactory.ch3.D" />
</beans>
上面的例子中A的实例化需要先实例化D,C,B。Spring会按照depend-on中定义的顺序来处理Bean。在这个例子里Spring实例化对象的顺利是D->C->B->A。虽然实例化对象的顺序和前面“A depends-on B && B depends-on C && C depends-on D”的情况一下,但是这里的意义是完全不同的。不能用“A depends-on D,C,B”代替“A depends-on B && B depends-on C && C depends-on D”。
depends-on是一个非常又用的功能,借助depends-on我们可以管理那些依赖关系不明显或者没有直接依赖关系的对象。
分享到:
相关推荐
"QtAV-depends-windows-x86+x64(ffmpeg依赖库).zip" 是一个包含了 FFmpeg 在 Windows 平台上运行所需的依赖库,特别针对 x86(32位)和 x64(64位)架构。 FFmpeg 依赖库通常包含以下几个核心组件: 1. **...
Spring 中的 DependsOn 注解可以保证被依赖的 bean 先于当前 bean 被容器创建。例如,在 B 上加上注解 @DependsOn({"a"}),这样可以保证 A 先于 B 被初始化。 需要注意的是,bean 属性的注入是在初始化方法调用之前...
"depends-x86依赖查询"工具正是为解决这个问题而设计的,它能帮助开发者和系统管理员轻松地查看和分析执行文件的依赖性。 首先,让我们详细解释一下什么是依赖关系。在Windows系统中,.exe和.dll文件之间存在依赖...
- **depends-on属性**:指定Bean的依赖关系,确保某些Bean在其他Bean之前初始化。 #### `<property>`元素 `<property>`元素用于配置Bean的属性。它具有以下属性: - **name属性**:表示要设置的属性名称。 - **...
官方版本,亲测可用
在Spring框架中,依赖注入(Dependency Injection,DI)是核心特性之一,它使得对象之间的关系在编译时并不固定,而是在运行时动态地通过容器进行管理。这大大提高了代码的可测试性和可维护性。在Spring 4版本中,...
实例化顺序基于Bean的依赖关系和`@DependsOn`注解。如果Bean之间没有依赖关系,Spring将按照Bean定义的顺序实例化。对于Prototype作用域,每次请求都会创建一个新的实例。 6. **后处理器注册**: Spring允许自定义...
标题中的"PyPI 官网下载 | rikaard-dep2-depends-rikaard-dep1-0.0.7.tar.gz"表明这是一个在Python的包管理平台PyPI上可下载的压缩文件,用于软件依赖管理。PyPI(Python Package Index)是Python开发者发布自己...
- **1.4.3 使用`depends-on`**: 可以通过`depends-on`属性指定当前Bean依赖于其他Bean,确保依赖的Bean先被创建。 - **1.4.4 惰性初始化Bean**: 通过设置`lazy-init`属性为`true`,可以让Spring容器延迟创建Bean,...
- **`depends-on`属性**:定义Bean之间的依赖关系,确保指定的Bean在当前Bean之前被初始化。 #### 三、`<property>`元素详解 - **功能概述**:`<property>`元素用于设置Bean的属性值,可以是简单的值、对其他Bean...
12. `depends-on` 属性:在某些特殊情况下,如需要确保某个Bean先于其他Bean被初始化,可以使用`depends-on`来指定依赖关系。 13. `<property>` 元素:用于设置Bean的属性。`name`属性对应Bean的属性名,`value`或`...
标题中的"auto-depends-plugin-2.2.0-b10.zip"是一个软件插件的zip文件,可能是一个自动化工具的依赖管理插件,版本号为2.2.0,b10可能是该版本的一个小迭代或者构建编号。这个插件可能是用于自动管理项目依赖关系,...
总之,Spring Bean之间的特殊关系丰富多样,涵盖了继承、前置依赖、引用以及更复杂的工厂Bean、代理Bean、作用域和事件监听等,这些特性使得Spring能够灵活地管理和协调Bean之间的协作,从而构建出复杂的系统架构。
- 通过`depends-on`属性控制Bean之间的依赖顺序。 - **延迟初始化Bean** - 延迟初始化的Bean会在第一次请求时才被创建,而不是在容器启动时。 - **自动装配协作对象** - 自动装配简化了依赖注入,但也有其局限...
2. **分析依赖关系**:Depends可以解析DLL及其依赖的其他DLL或系统模块,展示它们之间的依赖关系。这有助于识别可能导致运行时错误的缺失库或版本不匹配问题。 3. **模块信息查看**:除了函数,Depends还可以提供...
- 使用`depends-on`属性确保某些bean在其他bean之前初始化。 - **3.4.4 Lazy-initialized beans** - 指定了bean是否应该延迟初始化。 - **3.4.5 Autowiring collaborators** - 介绍了自动装配机制,即如何让...
总的来说,Depends-x64是Windows系统管理员和开发者不可或缺的工具,它提供了一个直观的界面来检查和理解64位应用程序的DLL依赖关系,从而有效地解决和预防“缺少DLL”错误。通过深入理解DLL的工作原理和Depends的...
有时需要确保某个Bean在另一个Bean之前初始化,这时可以使用`depends-on`属性来指定依赖关系。 - **1.4.4 懒加载Bean** 懒加载是指在第一次请求时才创建Bean实例,这种方式可以节省资源。 - **1.4.5 自动装配**...
depends-on 可以用来指定 Bean 的依赖关系,确保在依赖的 Bean 实例化之前,已经实例化了该 Bean。 9. 使用 init-method 和 destroy-method 来管理 Bean 的生命周期 init-method 和 destroy-method 可以用来管理 ...