`
darkma
  • 浏览: 527342 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类

Spring Autowired(required = false) 说明

 
阅读更多

 

  1. 当候选 Bean 数目不为 1 时的应对方法   
  2.   
  3. 在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。我们可以来做一个实验:   
  4.   
  5.   
  6. 清单 10. 候选 Bean 数目为 0 时   
  7.                    
  8. <?xml version="1.0" encoding="UTF-8" ?>   
  9. <beans xmlns="http://www.springframework.org/schema/beans"  
  10.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  11.       xsi:schemaLocation="http://www.springframework.org/schema/beans   
  12. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ">   
  13.   
  14.      <bean class="org.springframework.beans.factory.annotation.   
  15.          AutowiredAnnotationBeanPostProcessor"/>   
  16.   
  17.      <bean id="boss" class="com.baobaotao.Boss"/>   
  18.   
  19.      <!-- 将 office Bean 注释掉 -->   
  20.      <!-- <bean id="office" class="com.baobaotao.Office">   
  21.      <property name="officeNo" value="001"/>   
  22.      </bean>-->   
  23.   
  24.      <bean id="car" class="com.baobaotao.Car" scope="singleton">   
  25.          <property name="brand" value=" 红旗 CA72"/>   
  26.          <property name="price" value="2000"/>   
  27.      </bean>   
  28. </beans>   
  29.   
  30.   
  31.   
  32. 由于 office Bean 被注释掉了,所以 Spring 容器中将没有类型为 Office 的 Bean 了,而 Boss 的 office 属性标注了 @Autowired,当启动 Spring 容器时,异常就产生了。   
  33.   
  34. 当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring:在找不到匹配 Bean 时也不报错。来看一下具体的例子:   
  35.   
  36.   
  37. 清单 11. 使用 @Autowired(required = false)   
  38.                    
  39. package com.baobaotao;   
  40.   
  41. import org.springframework.beans.factory.annotation.Autowired;   
  42. import org.springframework.beans.factory.annotation.Required;   
  43.   
  44. public class Boss {   
  45.   
  46.     private Car car;   
  47.     private Office office;   
  48.   
  49.     @Autowired  
  50.     public void setCar(Car car) {   
  51.         this.car = car;   
  52.      }   
  53.     @Autowired(required = false)   
  54.     public void setOffice(Office office) {   
  55.         this.office = office;   
  56.      }   
  57.      …   
  58. }   
  59.   
  60.   
  61.   
  62. 当然,一般情况下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到(如为了快速启动 Spring 容器,仅引入一些模块的 Spring 配置文件),所以 @Autowired(required = false) 会很少用到。   
  63.   
  64. 和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。来看下面的例子:   
  65.   
  66.   
  67. 清单 12. 在 beans.xml 中配置两个 Office 类型的 Bean   
  68.                    
  69. …   
  70. <bean id="office" class="com.baobaotao.Office">   
  71.      <property name="officeNo" value="001"/>   
  72. </bean>   
  73. <bean id="office2" class="com.baobaotao.Office">   
  74.      <property name="officeNo" value="001"/>   
  75. </bean>   
  76. …   
  77.   
  78.   
  79.   
  80. 我们在 Spring 容器中配置了两个类型为 Office 类型的 Bean,当对 Boss 的 office 成员变量进行自动注入时,Spring 容器将无法确定到底要用哪一个 Bean,因此异常发生了。   
  81.   
  82. Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常:   
  83.   
  84.   
  85. 清单 13. 使用 @Qualifier 注释指定注入 Bean 的名称   
  86.                    
  87. @Autowired  
  88. public void setOffice(@Qualifier("office")Office office) {   
  89.     this.office = office;   
  90. }   
  91.   
  92.   
  93.   
  94. @Qualifier("office") 中的 office 是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同,所以 Spring 不将 @Autowired 和 @Qualifier 统一成一个注释类。下面是对成员变量和构造函数入参进行注释的代码:   
  95.   
  96. 对成员变量进行注释:   
  97.   
  98.   
  99. 清单 14. 对成员变量使用 @Qualifier 注释   
  100.                    
  101. public class Boss {   
  102.     @Autowired  
  103.     private Car car;   
  104.   
  105.     @Autowired  
  106.     @Qualifier("office")   
  107.     private Office office;   
  108.      …   
  109. }   
  110.   
  111.   
  112.   
  113. 对构造函数入参进行注释:   
  114.   
  115.   
  116. 清单 15. 对构造函数变量使用 @Qualifier 注释   
  117.                    
  118. public class Boss {   
  119.     private Car car;   
  120.     private Office office;   
  121.   
  122.     @Autowired  
  123.     public Boss(Car car , @Qualifier("office")Office office){   
  124.         this.car = car;   
  125.         this.office = office ;   
  126.      }   
  127. }   
  128.   
  129.   
  130.   
  131. @Qualifier 只能和 @Autowired 结合使用,是对 @Autowired 有益的补充。一般来讲,@Qualifier 对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。   

 

分享到:
评论
4 楼 shitouofIT 2018-01-26  
3 楼 liuchongming 2016-04-28  
2 楼 20101975liubin 2014-10-23  
1 楼 dudong0726 2012-08-15  
                

相关推荐

    spring autowired注解完整版

    如果希望该注入是可选的,可以将 @Autowired 注解的 required 属性设置为 false。 5. **@Autowired 与 @ComponentScan**:在 XML 配置中,&lt;context:component-scan&gt; 标签用于扫描指定包及其子包下的类,寻找使用了 ...

    Spring@Autowired注解与自动装配.rar

    @Autowired(required = false) private MyService optionalService; ``` - **通过XML配置控制**:在XML配置中,可以使用`&lt;context:component-scan&gt;`或`&lt;beans:beans&gt;`标签的`autowire`属性来开启或关闭全局的自动...

    Spring @Autowired

    `@Autowired`是Spring自动处理,而`@Required`则要求开发者在配置文件中显式声明依赖。 ### 4. 可选依赖与`@Autowired(required = false)` 默认情况下,`@Autowired`要求必须找到一个匹配的Bean。但可以通过设置`...

    (转)Spring中@Autowired注解和@Resource注解的区别

    但可以通过设置`required`属性为`false`来允许空值注入。 `@Resource`注解则源自JSR-250规范,被Spring框架支持。它的主要目的是基于名称来注入bean,也就是说,它首先尝试通过bean的名字来匹配。如果找不到名字...

    IntellijIDEA中MybatisMapper自动注入警告的6种解决方案.docx

    方案 1:为 @Autowired 注解设置 required = false 使用 @Autowired 注解时,若希望允许 null 值,可设置 required = false。这样可以解决警告,但这种方式有点蛋疼,特别是在大型项目中,需要到处补上 required = ...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    - @Autowired(required = false):允许注入可选依赖,如果找不到匹配的bean,则不会抛出异常。 - @Autowired与@Resource:虽然两者都可以用来自动装配,但@Autowired默认按类型匹配,而@Resource默认按名字匹配。 ...

    huifer#javaBook-src#spring注解1

    使用@Autowired(required = false)时,即便找不到Bean也不会报错该注解通常和@Autowired一起使用,可以当作ByName注入B

    spring的annotation的autowired

    - **按多重性匹配**:如果存在多个匹配的Bean,可以通过设置`required`属性为`false`,允许不注入任何Bean,避免报错。 - **按属性名称匹配**:如果Bean的属性名称与某个Bean的ID相同,Spring也会尝试进行匹配。 ##...

    Autowired报错原因分析和4种解决方案.docx

    如果可以接受注入的Mapper对象在某些情况下为NULL,可以通过在@Autowired注解中设置`required=false`属性来实现这一点。这样即使在找不到对应的Bean时也不会报错。 ```java @Autowired(required = false) private ...

    Spring使用@Autowired注解自动装配

    在Spring框架中,`@Autowired`注解是一个关键特性,用于简化依赖注入的过程。依赖注入是一种设计模式,它允许我们解耦代码,提高模块的可测试性和可维护性。在这个主题中,我们将深入探讨`@Autowired`的工作原理、...

    SpringIOC问题-回复1

    - 对于自我引用(A引用A)的情况,如果未指定`required=false`,Spring会尝试查找匹配的bean,找不到时抛出异常。使用`required=false`可避免这种情况。 - 对于互相引用(A引用B,B引用A)的循环依赖,Spring通过...

    spring-autowire.zip

    如果希望在找不到匹配bean时使用null或者默认值,可以使用`@Autowired(required = false)`。 在实际项目中,我们通常会配合@Configuration和@Bean注解来配置bean,这样可以更好地控制bean的创建和装配。同时,通过...

    Spring注解@Resource和@Autowired.doc

    @Autowired 按照类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置其 required 属性为 false。如果我们想使用按名称装配,可以结合@Qualifier 注解一起使用。 相比之下,@Resource ...

    如何完成spring的最小化XML配置

    如果找不到匹配的Bean,Spring会抛出异常,除非使用`required = false`标记为可选。对于多个匹配的Bean,可以使用`@Qualifier`注解指定具体Bean。 2. JSR-330的`@Inject` `@Inject`注解与`@Autowired`类似,但...

    Spring中你不知道的注入方式编程开发技术共6页.pdf

    使用`@Autowired`时,有时可能需要排除某些bean或覆盖默认的自动装配行为,这可以通过`@Primary`、`@Qualifier`和`@Autowired(required=false)`等注解实现。 8. **基于注解的配置**: 除了XML配置,Spring还支持...

    spring多个动态代理导致循环依赖报错问题解决

    4. **使用`@Autowired`的`required`属性**:在依赖注入的bean上,可以设置`@Autowired(required=false)`,表示该依赖不是必需的。这样,即使找不到依赖,Spring也不会抛出异常,而是继续处理其他bean。 5. **使用`@...

    你所不知道的Spring的@Autowired实现细节分析

    但在某些情况下,如`required=false`,Spring允许依赖缺失,并使用`null`值。 8. **@Autowired与@Resource的区别** `@Autowired`主要基于类型匹配,而`@Resource`则优先基于名称匹配。`@Resource`是JSR-250规范的...

    12 @Autowired是如何工作的?-Spring注解源码深度揭秘-慕课专栏1

    `@Autowired`的定义位于`org.springframework.beans.factory.annotation.Autowired`包中,其核心属性只有一个`required`,默认值为`true`。这个属性表示依赖是否必需,如果设置为`false`,即使找不到匹配的依赖,...

    SSH笔记-通过@Autowired配置注入关系

    2. **可选性**:如果你希望依赖是可选的,可以将`required`属性设置为`false`。如果Spring找不到匹配的Bean,它不会抛出异常,而是允许属性保持为`null`。 3. **多个候选Bean**:如果有多个相同类型的Bean,可以...

Global site tag (gtag.js) - Google Analytics