spring:简单的属性参考

在定义文件(XML配置文件)中定义Bean时,可以直接指定一个字符串值给属性值,如果在Bean定义文件中已经有一个定义的Bean实例,则可以直接让某个属性参考至这个实例。

有以下几种比较常用的方式:

1.使用<ref>直接指定参考至其他的Bean实例
2.使用<bean>标签并指定"class"属性来指定依赖对象
3.隐式自动绑定,分别是byType,byName将某个Bean实例绑定至其他Bean对应的属性
4.在构造方法上也能进行自动绑定
5.也可以设定"autodetect",一切交给Spring判定,自动完成。

以上几种注入方式注意事项如下:

1. <ref>方式:

<ref bean="XXX"/>,XXX填写的字符需是你要依赖的bean文件中的id名字,有些书上也叫Bean别名。如<bean id="XXX" class="YYYY"/>


2. <bean>方式:

前提条件必须是,这个Bean的实例只被某个属性参考一次,之后在定义文件中不再被其它Bean的属性所参考,那么可以直接在属性定义时使用<bean>标签,并仅需指定其"class"属性即可,如:
...
<property name="zzz">
<bean class="Xxx.Yyy.Zzz">
</property>
...
Spring的IoC容器会自动生成Zzz实例,并透过setZzz()方法将Zzz实例设定给需要实现的Bean。


3.1 byType方式:

在需要实现的Bean中,在<bean id="..." class="..." autowire="byType"> ,无需再指定属性参考而编写一个property,Spring会根据需要实现的Bean的setZzz()方法所接受的类型,来判断在Bean定义文件中是否定义有类似的类型对象,并将之设定给需要实现的Bean的setZzz()。使用自动绑定时,如果"byType"无法完成绑定,则抛出 org.springframework.beans.factory.Unsatisfied-DependencyException的异常。


3.2 byName方式:

使用byName方式,类似的在<bean id="..." class="..." autowire="byName"> ,但是需要注意的是Spring要根据Bean定义时的"id"属性上指定的别名与Setter名称是否一致来进行自动绑定。如setDate()方法来完成依赖注入,必须修改一下需要注入的Bean的id值为"date"名称,即名字要相同。如果使用"byName"无法完成自动绑定,则对应的Setter仅维持未绑定状态。


4. constructor方法

在构造方法上也可以尝试进行自动绑定。本人不是很推荐使用,因为这样很容易产生混乱,一边使用Type 3 Dependency Injection一边使用Type 2 Dependency Injection,使代码易读性下降不利于代码维护。有兴趣的朋友可以翻阅相关资料尝试。


5.autodetect方法

类似第3方法,<bean id="..." class="..." autowire="autodetect"> ,这时候Spring会尝试使用如"autowire"被设定为"constructor"来处理依赖关系的建立,如果没有完成依赖关系建立,则再尝试使用如"autowire"被设定为"byType"的方式来建立依赖关系。这是比较傻瓜的一种自动检测方式,虽然方便但是不推荐使用,因为也是容易降低代码的可读性。


相关

Spring自带一种依赖关系检测机制,由于很难从定义文件中看清楚是否每个属性都完成了设定,为了确定某些依赖关系确实建立,可以加入依赖检测,在<bean>标签使用时添加dependency-check="xxx",有四种检测方式:"simple"、"objects"、"all"、"none"。

"simple":只检查简单的属性是否完成依赖关系,如原生数据类型或字符串对象
"objects":检查对象类型的属性是否完成依赖关系
"all":检查全部的属性是否完成依赖关系
"none":默认值,不检查依赖关系

使用自动绑定时加入以来检测,如有未完成的依赖关系,则执行程序抛出 org.springframework.beans.factory.UnsatisfiedDependencyException异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值