聊聊@Autowired注解注入,写接口名字还是实现类的名字

用@Autowired注解注入,写接口名字还是实现类的名字

来自某程序员一个问答问题

  1. 有一点没明白,为什么注解@repository注解的是接口UserDAO的实现类UserDAOImpl,而在UserServiceImpl中使用@Autowired注解注入属性private UserDAO userDAO自动装配,为什么最后得到的是UserDAOImpl的实例。

-----上面是某位同学的提问,我也有这样的疑问----

  1. @Service注解服务层的时候,在unitest中,是从ApplicationContext.getBean(“实现类名字,首字母小写”) 这样获取的。

也就是说,在容器中初始化的Bean应该按照实现类名字规则。 这一点如果是用xml配置是不存在这样的问题,因为xml可以指定id, id 是接口,class指向实现类。

  1. 来自网友的回答:这个其实是创建了实现类的对象但引用了接口类型,即"InjectionDao injectionDao = new InjectionDaoImpl()", 这个其实是Java多态性(向上转型)的一种应用。在实现类处加@Repository注解,意思就是new InjectionDaoImpl(), 而在InjectionServiceImpl中定义属性InjectionDAO injectionDAO就是将new出来的这个InjectionDaoImpl对象向上转型为InjectionDao类型。

Spring中Autowired注入接口的几个问题

1.Spring怎么知道注入哪个实现?

As long as there is only a single implementation of the interface and that implementation is annotated with @Component with Spring’s component scan enabled, Spring framework can find out the (interface, implementation) pair.

If component scan is not enabled, then you have to define the bean explicitly in your application-config.xml (or equivalent spring configuration file).

如果Spring配置了component scan,并且要注入的接口只有一个实现的话,那么spring框架可以自动将interface于实现组装起来。如果没有配置component scan,那么你必须在application-config.xml(或等同的配置文件)定义这个bean。

可以理解为 在 application-service.xml 配置文件中声明了 component-scan

<context:component-scan base-package="com.system.service.impl"/>

在 com.system.service 下有一个接口类,在 com.system.service.impl 下有一个接口对应的实现类,且该实现类用 @Service 注解进行了标注。

在使用该接口类的时候,可以按照如下方式:

@Autowired
private UserloginService userloginService;

以此来进行自动装配。

2.需要@Qualifier和@Resource注解吗?

Once you have more than one implementation, then you need to qualify each of them and during auto-wiring, you would need to use the @Qualifier annotation to inject the right implementation, along with @Autowired annotation.

If you are using @Resource (J2EE semantics), then you should specify the bean name using the name attribute of this annotation.

一旦一个接口有多个实现,那么就需要每个特殊化识别并且在自动装载过程中使用@Qualifier和@Autowired一起使用来标明。如果是使用@Resource注解,那么你应该使用resource中属性名称来标注@Autowired.

3.为什么@Autowired使用在interface上而不是实现类上?

Firstly, it is always a good practice to code to interfaces in general.

Secondly, in case of spring, you can inject any implementation at runtime.

A typical use case is to inject mock implementation during testing stage.

首先,一般使用接口是很常用并且有益的变成技术。

其次,在spring中,你可以在运行过程中注入各种实现。一个很经典的情况就是在测试阶段,注入模拟的实现类。

  • SpringBoot使用@Autowired为多实现的接口注入依赖
  • 彻底理解Spring注解@Autowired实现原理
  • 详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理
  • Spring详细讲解@Autowired注解
  • Spring的@Autowired加到接口上但获取的是实现类的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring注入接口还是实现类,同一接口有多个实现类,如何注入

1、接口&#xff1a;IUserService public interface IUserService {public void sayHello(); }2、实现类&#xff1a;UserServiceImpl&#xff0c;实现了UserService接口 Service("UserServiceImpl ") public class UserServiceImpl implements IUserService{// 添…

Spring只能注入接口,不能注入实现类

只能注入接口&#xff0c;不能注入实现类。 Controller public class Test {AutowiredprivateRoleDao rdi; }privateRoleDao是个接口 这样注入就没有问题&#xff0c; 而注入 Controller public class Test {AutowiredprivateRoleDaoImpl rdi; }会报错&#xff1a;No qua…

调用Dubbo报错: com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method 问题原因和解决办法

我们在使用Dubbo的过程中&#xff0c;时常会碰到这个异常。而有可能导致这个异常的原因是非常多的&#xff0c;排查起来比较困难。下面把如何排查该问题的思路整理了一下&#xff0c;目前我知道的会导致这个异常的原因分为以下几类&#xff1a; 1.需要进行序列化的POJO类没有进…

Springboot dubbo @Service @Transactional 无法提供服务或者无法提供事务的解决办法

问题场景&#xff1a; 今天在springboot中集成spring事务的时候&#xff0c;遇到了一个大坑。如果&#xff08;springbootdubbo&#xff09;中添加 Service、Transactional 两个注解的时候&#xff0c;就不能进行dubbo服务注册了。 解决历程&#xff1a; 1&#xff0c;先是在…

Dubbo序列化

Dubbo序列化 dubbo作为一个rpc框架支持丰富的序列化方式&#xff0c;本文简单介绍dubbo的序列化。本文结构&#xff1a; 对象序列化是什么意思&#xff1f;dubbo序列化几个问题 对象序列化是什意思&#xff1f; 先来思考两个问题&#xff1a; 普通的Java对象的生命周期是仅…

什么是 serialVersionUID ? 序列化对象时必须提供 serialVersionUID 吗?

什么是 serialVersionUID &#xff1f; 序列化对象时必须提供 serialVersionUID 吗&#xff1f; 1&#xff0c;什么是 serialVersionUID &#xff1f; 顾名思义&#xff0c;serialVersionUID是序列化版本号。所有可序列化的类&#xff0c;都有一个静态serialVersionUID属性&a…

【Dubbo学习系列】Dubbo消费端的代理生成详解(@DubboReference和@Reference)

文章目录Spring中Dubbo实现RPC如何加载Reference和DubboReference注解DubboComponentScanRegistrar概括发现Refrence和DubboReference注解&#xff0c;并编织RPC通信逻辑ReferenceAnnotationBeanPostProcessor&#xff08;核心&#xff09;ReferenceDubboReferenceReference和D…

【Java编程】之 List 与数组之间的相互转换Arrays.asList 和 ArrayList 的 subList

文章目录一、数组转换成 List 集合二、List 集合转数组浅谈 Arrays.asList1、不能往 Arrays.asList 生成的 List 集合中添加元素Arrays.asList 只是简单的充当转换接口二、浅谈 ArrayList 的 subList1、subList 索引的取值边界2、subList 不可强转成 ArrayList3、对 subList 的…

谈Java集合类的toArray()的小bug

谈Java集合类的toArray()的小bug toArray()方法 它的作用是将集合转换成数组。但是这个方法有一个弊端&#xff0c;当toArray()方法使用不当时会产生ClassCastException&#xff08;类转换异常&#xff09; public static void main(String[] args) {List<Integer> li…

Dubbo系统里面MultipartFile文件传输问题Dubbo文件上传/传输服务

今天遇到一个问题&#xff0c;在Controller 层里面&#xff0c;直接使用MultipartFile 来接收上传的图片&#xff0c;遇到几个坑。 一、在spring配置文件里面配置文件上传 <!--文件上传--><bean name"multipartResolver"class"org.springframework.web…

Dubbo2.7文档详解

本篇博文参考dubbo官方文档 本编博文参考javaguide之rpc 文章目录一.RPC1.1 什么是 RPC?1.2 为什么要用 RPC?1.3 RPC 能帮助我们做什么呢&#xff1f;1.4 RPC 的原理是什么?1.5 常见的 RPC 框架总结二.既有 HTTP ,为啥用 RPC 进行服务调用?2.1 RPC只是一种设计而已2.2 HTTP…

12nm 制程、Zen+ 微架构 AMD Ryzen 7 2700X 处理器详细测试 - 电脑领域 HKEPC Hard

12nm 制程、Zen 微架构 AMD Ryzen 7 2700X 处理器详细测试 代号 Pinnacle Ridge、AMD 第二代 Ryzen 处理器正式登场&#xff0c;基于经改良的 Zen 微架构&#xff0c;改善了 Cache 及记忆体延迟表现&#xff0c;更先进的 12nm LP 制程&#xff0c;令核心时脉进一步提升&#…

Java之Serializable接口实现序列化和反序列化实例以及部分序列化的四种方法

首先需要明确的概念: 序列化&#xff1a;将数据结构或对象转换成二进制字节流的过程反序列化&#xff1a;将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程持久化&#xff1a;将数据写入文件中长久保存的过程称之为持久化序列化主要目的&#xff1a;是…

win10死机频繁怎么解决

Windows 10已经推出好几年&#xff0c;系统趋于稳定&#xff0c;但依旧不是完美&#xff0c;蓝屏、死机状态还是会出现&#xff0c;只是概率降低了很多&#xff0c;如果你的电脑遇到了突然死机或者频繁卡死的情况&#xff0c;或许你应该考虑对电脑进行重置了。系统自带的恢复重…

Jar包常见的反编译工具介绍与使用

反编译JAR能干什么: 排查问题、分析商业软件代码逻辑&#xff0c;学习优秀的源码思路。 反编译工具介绍 JD-GUI 下载地址&#xff1a;http://java-decompiler.github.io/ 点评&#xff1a;支持的java版本不会太高&#xff0c;中文注释能够正常显示。 Luyten 下载地址&#…

400 bad request的原因意思和解决方法

我们的电脑在使用的过程中&#xff0c;有的小伙伴在上网的时候可能就遇到过系统提示&#xff1a;400 bad request的情况。据小编所知这种情况&#xff0c;大致意思就是出现了错误的请求或者请求不能满足。原因是因为我们请求的语法格式出现呢错误或者其他情况等等。我们可以通过…

final关键字的作用 (修改方法、变量、类)

文章目录前言final关键字的含义?什么是final变量&#xff1f;什么是final方法?什么是final类&#xff1f;final关键字的好处关于final的重要知识点前言 Java中的final关键字非常重要&#xff0c;它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字&…

重装系统win10提示磁盘布局不受UEFI固件支持怎么办

原因分析&#xff1a; Win10系统新增UEFI检测机制&#xff0c;在BIOS开启了UEFI时&#xff0c;如果硬盘分区表格式不是GPT&#xff0c;则会提示无法重装系统win10&#xff0c;也就是说UEFIGPT或LegacyMBR才能安装win10。 解决方法一&#xff1a;关闭UEFI 1、重启系统时按Del…

win7按f8后没有进入安全模式怎么解决

win7f8后没有进入安全模式&#xff0c;在正确操作按F8没有进入安全模式之后&#xff0c;不知道怎么解决win7按f8后没有进入安全模式怎么解决&#xff0c;其实非常的简单&#xff0c;下面来看看详细的解决方法吧。 win7按f8后没有进入安全模式怎么解决 第一种方法&#xff1a;…

使用toArray将List转数组:使用Call to ‘toArray()‘ with pre-sized array argument ‘new String[list.size()]‘

代码示例&#xff1a; public static void main(String[] args) {List<String> list new ArrayList<String>();list.add("java");list.add("flink");list.add("spring");//第一种写法&#xff1a;该写法不规范String[] array1 li…