IoC容器篇(三)——依赖(二)
目录
依赖
2.依赖与配置细节
3.使用depends-on
4.怠惰初始化beans
翻译源:Spring官方文档
依赖
2.依赖与配置细节
直接数值
<property>元素的value值可以直接设置为人类可读的字符串形式,Spring会自动将其转换为内置类型。例如,字符串转整数。
package examples;
import java.util.Properties;
public class Example {Properties properties;public void setProperties(Properties properties) {this.properties = properties;}
}
<bean id="example" class="Examples.example"><property name="properties"><value>s=sssi=123</value></property>
</bean>
ps:Spring容器使用JavaBeans的PropertiesEditor机制将value中的文本转化为java.util.Properties实例。
idref元素是一种传递其他bean的id的一种可检验的方法。
<bean name="example" "examples.Example"><property name="foo"><idref bean="foo" /></property>
</bean>
<bean name="foo" class="example.Example"/>
ps:这种方法会在配置阶段(bean已经被创建)检验是否有手写错误。
ps:spring4.0之后,使用idref bean代替idref local。
ps:ProxyBeanFactory的bean定义中的AOP拦截器配置是常使用idref配置的地方。此处使用idref元素,防止拦截器名称拼错。
其他beans的引用
通过<ref>元素的bean属性指定一个目标bean是一种允许创建一个引用存在于当前容器或父容器中的任何一个对象的引用的常见形式,即使bean并不位于同一个xml文件。
<ref bean="example">
通过parent属性可以创建一个指向当前容器的父容器中的bean的引用。
parent的值可以为bean的id或bean的name中的任意一个值,而这个bean必须位于当前容器的父容器。
通常使用这种方式将一个存在于父容器中的bean包装为一个同名代理。
内部bean
定义在property元素或constructor-arg元素中的bean元素被称为内部bean。
内部bean不需要定义name或id,就算定义了,Spring框架也不会将其作为一个标识符来进行处理。
内部bean总是匿名且在外部bean被创建时创建。
内部bean不会被独立访问,也不会作为依赖被注入其他bean中。
集合
<list/>、<set/>、<map/>与<props/>元素分别用于设置Java Collection类型List、Set、Map与Properties的值。
<bean id="example" class="examples.Example"><property name="properties"><props><prop key="aaa">sss</prop> </props><property/><property name="list"><list><value>ssss</value> </list><property/><property name="map"><map><entry key="aaa" value="sss" /> <entry key="foo" value-ref="foo"/></map><property/><property name="set"><set><ref bean="foo" /> </set><property/>
</bean>
Spring容器支持集合合并,即孩子集合的值为双亲集合与孩子集合的合并,孩子集合的值会重载双亲集合的值。
<beans><bean id="parent" abstract="true" class="example.ComplexObject"><property name="adminEmails"><props><prop key="administrator">administrator@example.com</prop><prop key="support">support@example.com</prop></props></property></bean><bean id="child" parent="parent"><property name="adminEmails"><!-- the merge is specified on the child collection definition --><props merge="true"><prop key="sales">sales@example.com</prop><prop key="support">support@example.co.uk</prop></props></property></bean>
<beans>
ps:使用merge属性合并集合。
List元素的底层有排序的概念,所以,合并集合时,双亲集合的元素全部位于子集合元素之前。
合并不同类型的集合时,会导致抛出异常。并且合并集合只有在子bean与双亲bean之间才成立,在双亲bean上设置合并集合没有任何意义。
当使用使用的集合通过类型参数指定了元素类型,Spring会使用内置的类型转换机制进行类型转化。
package examples;
public class Example{private Map<String, Float> data;public void setData(Map<String, Float> data) {this.data = data;}
}
<bean id="example" class="examples.Example"><property name="data"><map><entry key="aaa" value="12.4" /></map></property>
</bean>
null与空字符串
Spring处理属性的空参数值如同空字符串。如果想要将null传入,需要使用<null>标签。
<bean class="examples.Example"><property name="sss"><null/></propety>
</bean>
使用p-namspace的xml缩写
p-namspace的允许使用bean的属性替代<property>子元素来描述属性值或协作bean。
Spring支持的可扩展的使用namespace的配置格式基于XML Schema定义。
<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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean name="classic" class="com.example.ExampleBean"><property name="email" value="foo@bar.com"/><property name="foo" ref="bean"/></bean><bean name="p-namespace" class="com.example.ExampleBean"p:email="foo@bar.com"p:foo-ref="foo"/><bean name="foo" class="examples.Foo"/></beans>
ps:如果声明的属性以Ref为结尾,那么会引发引用冲突。
ps:p-namespace并不如标准xml格式灵活。
ps:建议在使用p-namspace时,现在团队之中讨论,然后进行意见统一。
使用c-namespace的xml缩写
c-namespace的使用方法与p-namespace相同,使用构造器的参数的名称来设置值。
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="bar" class="x.y.Bar"/><bean id="baz" class="x.y.Baz"/><!-- traditional declaration --><bean id="foo" class="x.y.Foo"><constructor-arg ref="bar"/><constructor-arg ref="baz"/><constructor-arg value="foo@bar.com"/></bean><!-- c-namespace declaration --><bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="foo@bar.com"/></beans>
<bean id="foo" class="x.y.Foo" c:_0-ref="bar" c:_1-ref="baz"/>
ps:通过index来设置构造器参数。
ps:尽量在配置文件中只使用名称记号法。
复合属性名称
在设置属性时,可以使用复合属性或嵌套属性,只要路径中除了最终属性以外的所有组件都不为null。
<bean id="example" class="examples.Example"><property name="aaa.bbb.ccc.ddd" value="123" />
</bean>
3.使用depends-on
depends-on属性可以显示强制一个或多个bean在当前bean被初始化之前初始化。
<bean id="example" class="examples.Example" depends-on="foo,fuz" /><bean id="foo" class="examples.foo" />
<bean id="fuz" class="examples.fuz" />
ps:表示依赖多个bean时,可以使用逗号、空格或分号作为合法分隔符用以提供一组bean名称。
ps:depends-on属性除了可以控制对象的初始化顺序,还可以控制单例对象的销毁顺序,定义了depends-on属性的bean会先被销毁。
4.怠惰初始化beans
默认情况下,ApplicationContext会将创建配置所有单例beans作为初始化过程的一部分。
这种预初始化可以是配置错误与环境错误迅速找出。
可以通过将bean标识为怠惰初始化来阻止其预初始化过程。
怠惰初始化bean会告知IoC容器在bean 实例被第一次调用时才进行初始化,而不是在容器启动时初始化。
<bean id="example" class="examples.Example" lazy-init="true" />
ps:当一个怠惰初始化的bean被一个单例预初始化bean依赖时,怠惰初始化bean会在容器启动时被创建,然后注入预初始化bean中。
可以在容器级别开启怠惰初始化
<beans default-lazy-init="true"></beans>
翻译源:Spring官方文档
IoC容器篇(三)——依赖(二)相关推荐
- Spring的IOC创建对象的方式和代码基本解释为什么要有ioc的思维以及Ioc容器和spring依赖注入的解释
首先我们要知道 Ioc是个啥? IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致 ...
- 安卓修改电池容量教程_图吧小白教程 篇三十二:手机拆换原装电池教程——替换寿命将届的原厂电池,提升手机续航...
图吧小白教程 篇三十二:手机拆换原装电池教程--替换寿命将届的原厂电池,提升手机续航 2019-12-05 13:01:04 1点赞 20收藏 1评论 你是AMD Yes党?还是intel和NVIDI ...
- Spring之IOC容器篇
IOC:Inversion of control(控制反转的英文缩写),依赖对象的获得被反转了,一般是通过DI(dependency injection 依赖注入)来实现的,可以大大降低类之间的耦合度 ...
- [篇三章二]_Hyper-V + MS-DOS 6.22 + Windows 1.04
################################################## 目录 初次安装 Windows 1.04 视窗系统成功但是驱动有问题 官网下载 Windows 1 ...
- spring IOC 之篇三:默认标签的解析
private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {// 对import标签的处 ...
- spring源码分析第三天------spring核心IOC容器和依赖注入原理
基于XML的依赖注入 1.依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位.载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 IOC ...
- 依赖注入的三种方式_Spring IoC是如何进行依赖注入的
依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码.而Spring IoC这个思想的 ...
- 依赖反转原理,IoC容器和依赖注入:第2部分
目录 介绍 控制反转(IoC) 什么是控制反转 接口反转 流反转 创建反转 依赖注入 总结 介绍 这是有关依赖反转原理,IoC容器和依赖注入的文章的继续部分.在本文的上半部分,我解释了什么是依赖反转原 ...
- php 对ioc容器的理解,关于php:了解IoC容器和依赖注入
快进: 我写这篇文章的目的是为了更好地理解依赖项注入和IOC容器,同时也为了以后能够纠正其中的错误,并用它来帮助我的一些朋友了解它们. 到目前为止,我已经尝试阅读各种框架的文档(Laravel.Fue ...
最新文章
- Android四大基本组件和生命周期的介绍
- Social network Social computing(社会网络和社会计算)
- 开源php面板,宝塔面板nginx安装终于搞定了
- iangularjs 模板,AngularJS模板中的三元运算符
- 使用react实现select_React笔记——核心概念:9.表单
- python学得好 牢饭吃的早_关于学习python的几个好习惯?
- bootstrap 模态窗口按钮位置_Bootstrap模态框(modal)垂直居中
- NP、OSPF 故障排除
- SQL代码自动生成器
- java-net-php-python-jsp音像店租赁录像计算机毕业设计程序
- python+mitmdump实战(3/3)(附源码)
- 基于Html的个人展示网站设计与实现
- php天籁吉他乐器介绍网站系统
- UE-战斗无止境的复刻
- JDE910笔记2--OMW项目建立及简单使用[转]
- 计算机教学在教学方面的作用,浅谈信息技术在教学中的重要作用
- 计算机语音输入软件,语音输入法_语音输入法电脑版_语音输入法哪个好【最新】-太平洋电脑网...
- 如果再回到2013年
- Navicat Premium导入导出sql文件
- 什么是多态 ?多态具体体现在哪些?