文档章节

Spring Autowired(required = false) 说明

Dylan1009
 Dylan1009
发布于 2017/08/25 08:34
字数 916
阅读 92
收藏 0

        当候选 Bean 数目不为 1 时的应对方法   

        在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。我们可以来做一个实验:   

清单 10. 候选 Bean 数目为 0 时   

<?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.5.xsd ">   
  
     <bean class="org.springframework.beans.factory.annotation.   
         AutowiredAnnotationBeanPostProcessor"/>   
  
     <bean id="boss" class="com.baobaotao.Boss"/>   
  
     <!-- 将 office Bean 注释掉 -->   
     <!-- <bean id="office" class="com.baobaotao.Office">   
     <property name="officeNo" value="001"/>   
     </bean>-->   
  
     <bean id="car" class="com.baobaotao.Car" scope="singleton">   
         <property name="brand" value=" 红旗 CA72"/>   
         <property name="price" value="2000"/>   
     </bean>   
</beans>   

        由于 office Bean 被注释掉了,所以 Spring 容器中将没有类型为 Office 的 Bean 了,而 Boss 的 office 属性标注了 @Autowired,当启动 Spring 容器时,异常就产生了。   

        当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring:在找不到匹配 Bean 时也不报错。来看一下具体的例子:   

清单 11. 使用 @Autowired(required = false)   

package com.baobaotao;   
  
import org.springframework.beans.factory.annotation.Autowired;   
import org.springframework.beans.factory.annotation.Required;   
  
public class Boss {   
  
    private Car car;   
    private Office office;   
  
    @Autowired  
    public void setCar(Car car) {   
        this.car = car;   
     }   
    @Autowired(required = false)   
    public void setOffice(Office office) {   
        this.office = office;   
     }   
     …   
}   

        当然,一般情况下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到(如为了快速启动 Spring 容器,仅引入一些模块的 Spring 配置文件),所以 @Autowired(required = false) 会很少用到。    

        和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。来看下面的例子:     

清单 12. 在 beans.xml 中配置两个 Office 类型的 Bean   

…   
<bean id="office" class="com.baobaotao.Office">   
     <property name="officeNo" value="001"/>   
</bean>   
<bean id="office2" class="com.baobaotao.Office">   
     <property name="officeNo" value="001"/>   
</bean>   
…   
  

        我们在 Spring 容器中配置了两个类型为 Office 类型的 Bean,当对 Boss 的 office 成员变量进行自动注入时,Spring 容器将无法确定到底要用哪一个 Bean,因此异常发生了。   

        Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常:   

清单 13. 使用 @Qualifier 注释指定注入 Bean 的名称   

@Autowired  
public void setOffice(@Qualifier("office")Office office) {   
    this.office = office;   
}   
  

@Qualifier("office") 中的 office 是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同,所以 Spring 不将 @Autowired 和 @Qualifier 统一成一个注释类。下面是对成员变量和构造函数入参进行注释的代码:   

对成员变量进行注释:

清单 14. 对成员变量使用 @Qualifier 注释 

public class Boss {   
    @Autowired  
    private Car car;   
  
    @Autowired  
    @Qualifier("office")   
    private Office office;   
     …   
}   
  

对构造函数入参进行注释:

清单 15. 对构造函数变量使用 @Qualifier 注释  

public class Boss {   
    private Car car;   
    private Office office;   
  
    @Autowired  
    public Boss(Car car , @Qualifier("office")Office office){   
        this.car = car;   
        this.office = office ;   
     }   
} 

@Qualifier 只能和 @Autowired 结合使用,是对 @Autowired 有益的补充。一般来讲,@Qualifier 对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。

本文转载自:http://darkmasky.iteye.com/blog/1129828

Dylan1009
粉丝 5
博文 195
码字总数 131086
作品 0
广州
程序员
私信 提问
Spring4.1.6 常用注解

常用的spring注解有如下几种: @Controller @Service @Autowired @RequestMapping @RequestParam @ModelAttribute @Cacheable @CacheFlush @Resource @PostConstruct @PreDestroy @Repositor......

大糊涂
2015/06/10
183
0
SpringMVC 基本注解[@Resource,@Autowired,@Component]

使用spring注解@Autowired,@Component需要先配置schema: xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/co......

chencang001
2016/03/18
598
0
Spring 注解 @Resource和@Autowired

Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource、 @PostConstruct及@PreDestroy。 1. @Autowired @Autowired是Spring 提供的,需导入 Package:...

zahschusheng
2015/10/27
228
0
【spring】——常用注解介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fjj15732621696/article/details/80643952 组件类注解 在spring注入bean的时候常用的一种方式就是通过注解,装...

DD_Davina
2018/06/10
0
0
spring @Autowired 与@Resource的区别

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。 @Resource的作用相当于@Autowired,只不过@Autowire...

xf_xin
2012/12/03
138
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部