Spring自动装配byName和byType的区别-程序员宅基地

技术标签: spring  java  后端  


前言

开发的时候一直用@Autowired@Resource注解实现自动装配,但是一直不明白byType这个装配方式是什么,研究才明白这两者之间的区别。


一、byName

@Resource注解一般是先根据名称去查找,如果没有再根据类型查找

一般Spring用@Resource注解实现byName,这个注解比较简单理解,就是用对象名注册到Spring容器中,如果出现相同名称项目启动就会报错。

二、byType

1.Class类型

首先咱们先理解什么是Class类型:

每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别:Run-Time
Type Identification),多态就是基于RTTI实现的。
每一个类都有一个Class对象,每当编译一个新类就产生一个Class对象,基本类型 (boolean,
int等)有Class对象,数组有Class对象,就连关键字void也有Class对象(void.class)。Class对象对应着java.lang.Class类,如果说类是对象抽象和集合的话,那么Class类就是对类的抽象和集合。

2.@Autowired

当你用一个接口,并且有多个实现类,同一个方法会有多种不同的实现逻辑。

接口Car

public interface Car {
    
    int find();
    int out();
}

实现类Benz

import org.springframework.stereotype.Service;

@Service
public class Benz implements Car{
    
    @Override
    public int find() {
    
    	System.out.println("奔驰");
        return 0;
    }

    @Override
    public int out() {
    
        return 0;
    }
}

实现类Honda

import org.springframework.stereotype.Service;

@Service
public class Honda implements Car{
    
    @Override
    public int find() {
    
        System.out.println("本田");
        return 0;
    }

    @Override
    public int out() {
    
        return 0;
    }
}

控制层

import com.example.mqredises.entity.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/car")
public class CarController {
    
    @Autowired
    private Car car;
    
    @RequestMapping("/test")
    public int test(){
    
        return car.find();
    }
}

这个时候编译器会报错,显示
Could not autowire. There is more than one bean of ‘Car’ type.
Beans:
benz (Benz.java) honda (Honda.java)
会找到多个相同Car类型的Bean
这个时候咱们有两种解决方案:

  1. 使用@Qualifier,里面填具体的Bean名称,这样就也是转化成byName的方式去自动装配对象。
@Qualifier("benz")
    @Autowired
    private Car car;
  1. 改成用上文的@Resource注解,如果没指定名称,这个时候编译能通过但是运行会报错,所以也是需要指定对应的Bean名称
@Resource(name = "benz")
    private Car car;

总结

实际上Spring的byName和byType基本上是不会出错的,都是可用的,只是有时候会出现不同包名底下有相同的类名,导致注册到Spring容器里报错了,也就是byName;而byType也是直接指定了接口的类型但底下却有多个实现类也会造成报错,实际开发过程中,一般都是直接指定实现类的类型,这样也不会出现报错;根据自己的项目架构选择合适的注解即可。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42706375/article/details/129765788

智能推荐

Ubuntu 下面安装gtk+-2.0_你的机器没有安装gtk的开发库,ubantu18.04-程序员宅基地

文章浏览阅读5.2k次。在Ubuntu下面安装飞鸽,iptux,编译源码的时候需要使用gtk+2.0,貌似大多数的图形界面软件都依赖于gtk+2.0,所以很有安装的必要好像安装的步骤挺复杂的,网上找到的文章,贴在这里留着以后备用。 apt-get install build-essential #这将安装gcc/g++/gdb/make 等基本编程工具apt-get install gnome-core-devel #这将安装 lib_你的机器没有安装gtk的开发库,ubantu18.04

windows环境下JSP环境搭建:Apache2(1)-程序员宅基地

文章浏览阅读307次,点赞2次,收藏3次。在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

Android:利用Java反射调用@hide的API_connectivitymanager 反射-程序员宅基地

文章浏览阅读1.6w次,点赞4次,收藏13次。设置使用3G数据功能:从源代码看到隐藏的API(ConnectivityManager.java): /** * Sets the persisted value for enabling/disabling Mobile data. * * @param enabled Whether the mobile data connection should_connectivitymanager 反射

[渝粤教育] 中国地质大学 互换性与测量技术 复习题 (2)_要求两孔同轴度φ0.3mm最大偏差是多少-程序员宅基地

文章浏览阅读941次。《互换性与测量技术》模拟题一.单选题1.优先选用基孔制的原因是().A.孔比轴难加工B.减少定尺寸孔用刀具量具的规格和数量C.减少孔和轴的公差带数量D.从工艺上讲应先加工孔后加工轴2.评定齿轮传递运动准确性的指标是().A.齿距累积总偏差B.单个齿距偏差C.齿廓总偏差D.螺旋线总偏差3.当几何公差框格的指引线箭头与尺寸线对齐时所表示的被测要素是().A.轮廓要素B.单一要素C.中心要素D.基准要素4.螺纹代号M20×2-7g6g表示的螺纹是().A.粗牙普通外螺纹B.粗_要求两孔同轴度φ0.3mm最大偏差是多少

Simulink模型转为TwinCAT3可以运行的ST程序_simulink导入到twincat-程序员宅基地

文章浏览阅读1k次。@Simulink PLC Coder :将Simulink模型转为TwunCAT程序1 先把simulink程序封装为一个子系统subsystem,标注好输入输出端口参考链接:https://ww2.mathworks.cn/help/plccoder/ug/plc-coder-general.html#bsemuq2-12 程序内不能包含任何连续状态的模块(比如微分,积分模块),而且有不支持的等simulink模块(比如Clock模块),因此需要用离散状态的功能块替代,或者编写MATLAB _simulink导入到twincat

程序员35岁真的是分水岭吗?复习指南_程序员35岁为什么会是一个分水岭-程序员宅基地

文章浏览阅读100次。缘起随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,还有应用之间的互相调用等等问题,插件化技术应用而生。如果没有插件化技术,美团、淘宝这些集成了大量“app”的应用,可能会有几个g那么大。所以,当今的Android移动开发,不会热修复、插件化、组件化,80%以上的面试都过不了。阿里P8大佬每天熬夜到凌晨一两点,花了将近半个月时间将Android热修复框架、插件化框架、组件化框架、图片加载框架、网络访问框架、RxJava响应式编程框架、_程序员35岁为什么会是一个分水岭

随便推点

Mybatis学习日记(二)--mybatis-generator_org.mybatis.generator.ant.generatoranttask cannot -程序员宅基地

文章浏览阅读4.6k次。使用MyBatis-generator自动生成MyBatis映射代码下载mybatis-generator.1.3.1.jar 点击打开链接(包含英文api)还需要ant-1.6.5.jar主要说下如何使用配置文件生成,建立 config.xml

Linux~vim的三种模式下命令的基本使用和vim的额外功能(缓存、多文件编辑-程序员宅基地

文章浏览阅读671次,点赞19次,收藏6次。最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

UE4 服务器连接中版本比较_ue4 networkversionoverride-程序员宅基地

文章浏览阅读819次。需求一个工程使用源码版本运行,一个工程使用发布版本引擎运行,两个客户端在Editor模式下,可以通过JoinSession这种方式进行连接,正常会判断两份客户端版本不同不可以连接,可以通过绑定FNetworkVersion::IsNetworkCompatibleOverride 来实现自定义的版本比较,这里比较简单粗暴,具体详细的可以参考 https://zhuanlan.zhihu.com/p/158986763 实现具体方法(FNetworkVersion::IsNetworkCompatibleO_ue4 networkversionoverride

前后端数据传递之form-data_from-data类型的接口参数怎么传-程序员宅基地

文章浏览阅读5.5k次,点赞2次,收藏3次。前后端接口数据联调有一种form-data形式,一般用来做文件上传,但是有时在登录的时候,也会用到这种格式传递数据,此时就需要通过借助FormData对象实现。_from-data类型的接口参数怎么传

Win10解决Disciples 2圣战群英传2卡顿问题_disciples 2如何窗口化运行-程序员宅基地

文章浏览阅读5.9k次。最近想翻点老游戏出来玩,比如圣战群英传2,但是卡得我mmp,一通搜索和捣鼓之后,终于发现了比较简单的解决问题的方法。1、首先确认电脑中是否有vcredist2010,至少08年以后的VC++库,没有就安。2、检查游戏根目录下有没有d3d9.dll,没有就下方传送门。https://dl.pconline.com.cn/download/91252.html如果还没能解决问题,那么:3、看看根目录有没有Disciple.ini,如果没有:3.1、看看根目录有没有一个骷髅头头像的Importer.e_disciples 2如何窗口化运行

数据链路层循环冗余(CRC)检验_链路层循环冗余校验码是检验哪一部分-程序员宅基地

文章浏览阅读5.5k次。数据链路层有许多协议,但有三个基本问题是相同的:封装成帧、透明传输和差错检验。为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检验措施,目前广泛使用的是循环冗余(CRC)检验的检错技术。 CRC检验原理: 在发送端,先把数据划分为组,假定每个组k个比特。现假定待传送的数据M=101001(k=6)。CRC运算就是在数据M后面添加供差错检验用的n位冗余码,然后构成一个帧发送出去,_链路层循环冗余校验码是检验哪一部分

推荐文章

热门文章

相关标签