详解Spring @Autowired 注入小技巧

 更新时间:2018年07月24日 09:47:16   作者:拥抱心中的梦想  
这篇文章主要介绍了详解Spring @Autowired 注入小技巧,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

今天和同事讨论到Spring自动注入时,发现有这么一段代码特别地困惑,当然大致的原理还是可以理解的,只不过以前从来没有这么用过。想到未来可能会用到,或者未来看别人写的代码时不至于花时间解决同样的困惑,所以小编还是觉得有必要研究记录一下。

一、同一类型注入多次为同一实例

首先让我们先看下这段代码是什么?

@Autowired
private XiaoMing xiaoming;

@Autowired
private XiaoMing wanger;

XiaoMing.java

package com.example.demo.beans.impl;

import org.springframework.stereotype.Service;

/**
 * 
 * The class XiaoMing.
 *
 * Description:小明
 *
 * @author: huangjiawei
 * @since: 2018年7月23日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
@Service
public class XiaoMing {
 
 public void printName() {
  System.err.println("小明");
 }
}

我们都知道 @Autowired 可以根据类型( Type )进行自动注入,并且默认注入的bean为单例( SingleTon )的,那么我们可能会问,上面注入两次不会重复吗?答案是肯定的。而且每次注入的实例都是同一个实例。下面我们简单验证下:

@RestController
public class MyController {
 
 @Autowired
 private XiaoMing xiaoming;
 
 @Autowired
 private XiaoMing wanger;
 
 @RequestMapping(value = "/test.json", method = RequestMethod.GET)
 public String test() {
  System.err.println(xiaoming);
  System.err.println(wanger);
  return "hello";
 }
}

调用上面的接口之后,将输出下面内容,可以看出两者为同一实例。

com.example.demo.beans.impl.XiaoMing@6afd4ce9
com.example.demo.beans.impl.XiaoMing@6afd4ce9

二、注入接口类型实例

如果我们要注入的类型声明为一个接口类型,而且该接口有1个以上的实现类,那么下面这段代码还能够正常运行吗?我们假设 Student 为接口, WangEr XiaoMing 为两个实现类。

@Autowired
private Student stu1;

@Autowired
private Student stu2;
@Service
public class XiaoMing implements Student {
@Service
public class WangEr implements Student {

答案是上面的代码不能正常运行,而且Spring 还启动报错了,原因是Spring想为 Student 注入一个单例的实例,但在注入的过程中意外地发现两个,所以报错,具体错误信息如下:

Field stu1 in com.example.demo.controller.MyController required a single bean, but 2 were found:
 - wangEr: defined in file [C:\Users\huangjiawei\Desktop\demo\target\classes\com\example\demo\beans\impl\WangEr.class]
 - xiaoMing: defined in file [C:\Users\huangjiawei\Desktop\demo\target\classes\com\example\demo\beans\impl\XiaoMing.class]

那该怎么弄才行呢?一般思路我们会想到为每个实现类分配一个id值,结果就有了下面的代码:

@Autowired
private Student stu1;

@Autowired
private Student stu2;
@Service("stu1")
public class XiaoMing implements Student {
@Service("stu2")
public class WangEr implements Student {

做完上面的配置之后,Spring就会根据字段名称默认去bean工厂找相应的bean进行注入,注意名称不能够随便取的,要和注入的属性名一致。

三、总结

  1. 1、同一类型可以使用@Autowired注入多次,并且所有注入的实例都是同一个实例;
  2. 2、当对接口进行注入时,应该为每个实现类指明相应的id,则Spring将报错;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java在运行时识别类型信息的方法详解

    Java在运行时识别类型信息的方法详解

    这篇文章主要给大家介绍了关于Java在运行时识别类型信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考借鉴,下面来一起看看吧
    2019-01-01
  • 如何使用IntelliJ IDEA搭建MyBatis-Plus框架并连接MySQL数据库

    如何使用IntelliJ IDEA搭建MyBatis-Plus框架并连接MySQL数据库

    这篇文章主要介绍了如何使用IntelliJ IDEA搭建MyBatis-Plus框架并连接MySQL数据库,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • java二叉树的非递归遍历

    java二叉树的非递归遍历

    二叉树的递归遍历比较简单,这里就不聊了,今天主要聊聊二叉树的非递归遍历,主要借助于“栈”后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历
    2020-12-12
  • 解决mybatis三表连接查询数据重复的问题

    解决mybatis三表连接查询数据重复的问题

    这篇文章主要介绍了解决mybatis三表连接查询数据重复的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • htmlcleaner使用方法及xpath语法初探

    htmlcleaner使用方法及xpath语法初探

    HtmlCleaner是一个开源的Java语言的Html文档解析器。HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档
    2015-08-08
  • idea2020.1.3 手把手教你创建web项目的方法步骤

    idea2020.1.3 手把手教你创建web项目的方法步骤

    这篇文章主要介绍了idea 2020.1.3 手把手教你创建web项目的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Springboot+mybatis-plus+注解实现数据权限隔离

    Springboot+mybatis-plus+注解实现数据权限隔离

    本文将结合实例代码,介绍Springboot+mybatis-plus+注解实现数据权限隔离,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Java使用poi生成word文档的简单实例

    Java使用poi生成word文档的简单实例

    Java POI是一个用于处理Microsoft Office文件(如Word、Excel和PowerPoint)的API,它是一个开源库,允许Java开发者读取、创建和修改这些文档,本文给大集介绍了Java使用poi生成word文档的简单实例,感兴趣的朋友可以参考下
    2024-06-06
  • java如何将map数据存入到实体类对象中

    java如何将map数据存入到实体类对象中

    在Java编程中,经常需要将Map集合中的数据转换为实体类对象,这可以通过反射机制实现,即通过遍历Map对象,使用反射根据键名对应实体类的属性名,动态调用setter方法将值设置到实体对象中,这样的操作使得数据从Map结构转移到了具体的JavaBean中,便于后续的操作和管理
    2024-09-09
  • Java实现压缩图片大小

    Java实现压缩图片大小

    这篇文章主要为大家详细介绍了Java实现压缩图片大小,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论