读书人

Spring核心技术-IoC的Bean根本管理3

发布时间: 2012-11-21 08:23:25 作者: rapoo

Spring核心技术----IoC的Bean基本管理3

属性参考

??如果在Bean定义文件中已经有一个定义的Bean实例,则可以直接让某个属性参考这个实例。

???????例如:

===================

ApplicationContext.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"
?xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
?

<!--以有定义的bean-->
?<bean id="databean" autowire="byType">


?? <constructor-arg index="0">
?????? <value>Justin</value>
? ?</constructor-arg>
?? <constructor-arg index="1">
?????? ??<value>Hello</value>
?? </constructor-arg>


?</bean>

............

----------------------------------------

?里面并没有指定date属性,而是透过自动帮定,在“autowire”属性上指定的“byType”,所以会根据bean的setDate()方法所接受的类型,来判断Bean定义文件中是否定义有类似的类型对象,并将之设个setDate().

使用自动帮定时,如果“byType”无法完成帮定,则抛出org.springframework.beans.factory.Unsatisfied-DependencyException异常。

?

使用"byName" 来帮定,则会根据Bean定义时的“id”属性上指定的别名与Setter名称是否一致来进行自动帮定

实例:

?

Bean定义文件

----------------------------------------

............

?<bean id="date" autowire="byName">
???? <constructor-arg index="0">
?????? ?<value>Justin</value>
???? </constructor-arg>
???? <constructor-arg index="1">
??????? <value>Hello</value>
???? </constructor-arg>
?</bean>

..............

-----------------------------------------

如果使用"byName"无法完成自动帮定,则对应的Setter仅维持未帮定状态。

?

也可以在构造方法上进行自动帮定。

实例:

?

Bean定义文件

---------------------------------

..............

?<bean id="date" autowire="constructor">
??????? <constructor-arg index="0">
???????????? <value>Justin</value>
?????????</constructor-arg>
??????? <constructor-arg index="1">
???????????? <value>Hello</value>
?????? </constructor-arg>
?</bean>

..............

---------------------------------

由于"autowire"设定为"constructor",在建立依赖关系时,容器会试图比对Bean实例类型,及相关的构造方法上的参数类型,如果符合则选用构造方法来建立Bean的实例。

如果无法完成帮定则抛出:org.springframework.beans.factory.UnsatisfiedDependencyException异常。

还可以将"autowire"设定为"autodetect",一切交给Spring来判断有什么方式进行帮定。

当"autowire"被设定为"autodetect"时,Spring会先尝试构造方法(“constructor”)来处理依赖关系的建立,如果没有完成依赖关系建立,则再尝试使用如"byType"的方式来建立依赖关系。

?

?

?依赖检查

?

在隐式自动绑定中,由于没办法从定义文件中,清楚地看到是否每个属性都完成设定,为了确保某些依赖关系确实建立,可以加入以来检查,在<bean>标签使用时设定“dependecy-check”,

可以有4种依赖检查方式:"simple","objects","all","none".

"simple":只检查简单的属性是否完成依赖关系,像是原生(primitive)数据类型或字符串对象。"objects":设定则检查对象类型的属性是否完成依赖关系。"all":检查全部的属性是否完成依赖关系。"none":默认值,表示不检查依赖性。

实例:

?

Bean定义文件

---------------------------------------

..........

<bean id="date" dependency-check="all">
??????? <constructor-arg index="0">
???????????? <value>Justin</value>
?????????</constructor-arg>
??????? <constructor-arg index="1">
???????????? <value>Hello</value>
?????? </constructor-arg>
?</bean>

..........

---------------------------------------