spring 自动装配

本文介绍了Spring IoC容器中的自动装配机制,包括五种自动装配类型:no、byName、byType、constructor和autodetect,并探讨了它们的工作原理及应用场景。此外,还讨论了自动装配的优点和缺点。
摘要由CSDN通过智能技术生成

Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。autowire一共有五种类型。由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置。在xml配置文件中,可以在<bean/>元素中使用autowire属性指定。

autowire属性取值:

模式

说明

no

不启用自动装配。Autowire默认的值

byName

根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

byType

通过属性的类型查找JavaBean依赖的对象并为其注入。如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。

constructor

与byType的方式类似,与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

autodetect

通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。

(自动装配是用来引入bean的)

注意:

1、如果直接使用property和constructor-arg注入依赖的话,那么将总是覆盖自动装配。而且目前也不支持简单类型的自动装配,这里所说的简单类型包括基本类型、String、Class以及简单类型的数组。

2、当按Bean名称自动装配类型存在错误装配JavaBean的可能。如果配置文件中定义了与需要自动装配的JavaBean的名称相同而类型不同的JavaBean,那么它会错误地注入不同类型的JavaBean。

3、自动装配类型也会出无法自动装配的情况。例如,在配置文件中再次添加一个JavaBean类的实现对象,byType自动装配类型会因为无法自动识别装配哪个JavaBean而抛出

org.springframework.beans.factory.UnsatisfiedDependecyException异常。要解决这个问题,只能通过混合使用手动装配来拼写装配哪个JavaBean。

自动装配的优缺点

优点包括:

1、自动装配能显著减少配置的数量。不过,采用bean模板(见这里)也可以达到同样的目的。

2、自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。

缺点:

1、尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。

2、对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值