Bean自动装配

spring IoC容器可以自动装配(autowire)来协作bean之间的相互联系。
autowire一共有五种类型。由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置,这样可以减少我们的配置文件。

no
不采用自动装配

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

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

constructor
与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

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

注意:

  • 如果直接使用property和constructor-arg注入依赖的话,那么将总是覆盖自动装配。
  • 目前不支持简单类型(基本类型、String、Class以及简单类型的数组)的自动装配。
  • byType和constructor自动装配模式也可用于数组和指定类型的集合。在这种情况下容器中的所有匹配的自动装配对象将被用于满足各种依赖。
  • 自动装配还可以与依赖检查结合使用,这样依赖检查将在自动装配完成之后被执行。

自动装配的优点:

  • 自动装配能显著减少配置的数量。
  • 自动装配可以使配置与java代码同步更新。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。

自动装配的缺点:

  • 装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。
  • 对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。
  • 当根据类型进行自动装配的时候,容器中可能存在多个bean定义跟自动装配的setter方法和构造器参数类型匹配。如果bean定义不唯一,装配时就会抛出异常,面对这种场景我们有几个方案进行选择:
    • 第一个方案就是弃自动装配而改用显式装配;
    • 第二个方案就是在bean定义中通过设置’autowire-candidate’属性为’false’来将该bean排除在自动装配候选名单之外;
    • 第三个方案是通过在bean定义中设置’primary’属性为’true’来将该bean设置为首选自动装配bean。最后,对于使用Java 5的用户来说,可能会使用注解的形式来配置bean。
时间: 2025-01-29 18:20:15

Bean自动装配的相关文章

spring入门(8) 装配Bean之自动装配

Spring_Autowiring collaborators 在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配). byName,byType,constructor下面来分别介绍一下这些是如何自动装配的 <bean id="foo" class="...Foo" autowire="autowire type"> Mode            Explanation no: (Default

《Spring攻略(第2版)》——1.12 用@Autowired和@Resource自动装配Bean

1.12 用@Autowired和@Resource自动装配Bean 1.12.1 问题 在Bean配置文件中设置autowire属性进行的自动装配将装配一个Bean的所有属性.这样的灵活性不足以仅仅装配特定的属性.而且,你只能通过类型或者名称自动装配Bean.如果这两种策略都不能满足你的需求,就必须明确地装配Bean. 1.12.2 解决方案 从Spring 2.5起,自动装配功能进行了多处改进.你可以通过用@Autowired或者@Resource(在JSR-250:Java平台常见注解中定

《Spring攻略(第2版)》——1.11 用XML配置自动装配Bean

1.11 用XML配置自动装配Bean 1.11.1 问题 当一个Bean需要访问另一个Bean时,你可以显式指定引用装配它.但是,如果你的容器能够自动装配Bean,就可以免去手工配置装配的麻烦. 1.11.2 解决方案 Spring IoC容器能够帮助你自动装配Bean.你只要在的autowire属性中指定自动装配模式就可以了.表1-2列出了Spring支持的自动装配模式. *默认模式是no,但是可以设置根元素的default-autowire属性修改.这个默认模式将被Bean自己指定的模式覆

Spring自动装配的学习

在xml配置文件中,autowire有6种类型,可以在<bean/>元素中使用autowire属性指定: 模式 说明 no 不使用自动装配,必须通过ref元素指定依赖,默认设置. byName 根据属性名自动装配.此选项将检查容器并根据名字查找与 属性完全一致的bean,并将其与属性自动装配. byType 如果容器中存在一个与指定属性类型相同的bean,那么将与 该属性自动装配:如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配:如果没有找到相匹配的bean

Spring中我们用到的功能实现:基于注解的Ioc自动装配

  我们要完成自动装配,那么就要有一个存放bean对象的容器,然后要有装配的注解,那么哪些类该被存到容器呢,在spring中我们使用过@Service.@Resource等,看下面的代码,你也可以做到.     来看看这是一个简单的容器接口 /**  * 容器接口  * @author:rex  * @create_time:2014-6-26  * @version:V1.0  */ public interface Container { Object getBean(String name

spring mvc-springmvc+mybatis 自动装配装配依赖的失败;嵌套例外

问题描述 springmvc+mybatis 自动装配装配依赖的失败;嵌套例外 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCr

autowired-SpringMVC+Spring Controller自动装配失败

问题描述 SpringMVC+Spring Controller自动装配失败 使用SpringMVC+Hibernate+Spring做demo练习,但是启动时报错,说是Controller里依赖的LoginService无法自动装配. 我自己写了个Main类做测试,Dao和Service都是可以自动装配的,唯独Controller不可以,网上看了好多类似的问题,但是也没有解决我的问题,希望哪位高手能帮我解答下,谢谢. 启动时报错: 严重: StandardWrapper.Throwable o

spring mvc-Spring自动装配,求大神答疑

问题描述 Spring自动装配,求大神答疑 小弟最近刚学的spring 自动装配有点问题请教: 这个是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&quo

Spring自动装配不成功,问了好几个人都没有结果,求大神指导!!

问题描述 以下的程序中当明确使用name-ref的时候可以将namebean绑定到personbean上,但是自动装配的时候总是装配不少,实在不明白怎么回事儿:Person1:Person[name=Carose,car=Car[brand=Audi,price=340000.0],address=Address[country=中国,city=北京]]Person2:Person[name=null,car=Car[brand=Audi,price=340000.0],address=Addr