首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

spring 到底注入接口还是实现

今天半夜写代码时,脑子一懵把@Repository注解写在了接口上,导致bean无法完成注入。 于是引发了一系列百度,看到了很多说不错答案。...关于上面的问题解释: @Service注解是标注在实现,因为@Service是把spring容器中bean进行实例化,也就是等同于new操作,只有实现是可以进行new实例化,而接口则不能,...问题1:spring 到底注入接口还是实现实现 在最初学习spring时,我们使用时配置方式来实现。...问题2:用@Autowired时候,到底是写接口名字还是实现名字呢? 我们应该写接口。 @Autowired,Spring会按 byType方式寻找接口实现,将其注入。...存在多个实现,应该指定名字,可以通过 byName 注入方式。可以使用 @Resource 或 @Qualifier 注解。

8.4K21
您找到你想要的搜索结果了吗?
是的
没有找到

spring为何要注入接口,而注入接口实现就会报错

首先说明,注入对象确实为实现对象。...(并不是实现代理对象,注入并不涉及代理)   如果只是单纯注入是可以用实现接收注入对象,但是往往开发中会对实现做增强,如事务,日志等,实现增强AOP技术是通过动态代理实现,而spring默认是...JDK动态代理,对实现对象做增强得到增强实现是兄弟关系,所以不能用实现接收增强对象,只能用接口接收。...只能强转为IA,而不能转为AImpl,因为JDK代理得到AImplProxy与AImpl是兄弟关系而非父子   由于以上原因,如果将对象注入实现而非接口的话,在代理时就会报错。...不过应该不会需要这么做,使用接口本来就是解耦,你直接用实现接收注入对象岂不是失去了注入意义。 CGLIB(Code Generation Library)是一个开源项目!

1.5K10

Spring 一个接口多个实现怎么注入

实现接口 IAnimal, 且该接口只有 DogImpl这一个实现,那么在引用实现时候,我们使用实现接口(像上面程序展示那样)。...Spring会按 byType方式寻找接口实现,将其注入。...那么在同一型拥有多个实现时候,如何注入呢?     答:这种场景下,只能通过 byName 注入方式。可以使用 @Resource 或 @Qualifier 注解。...private IAnimal dogImpl; ...... } 总结: 1、@Autowired 是通过 byType 方式去注入, 使用该注解,要求接口只能有一个实现。...2、@Resource 可以通过 byName  byType方式注入, 默认先按 byName方式进行匹配,如果匹配不到,再按 byType方式进行匹配。

2.4K20

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

IAnimal, DogImpl实现接口 IAnimal, 且该接口只有 DogImpl这一个实现,那么在引用实现时候,我们使用实现接口(像上面程序展示那样)。...Spring会按 byType方式寻找接口实现,将其注入。...这是由于 @Autowired 特性决定: @Autowired 注入方式是 byType 注入, 当要注入类型在容器中存在多个时,Spring是不知道要引入哪个实现,所以会报错。...那么在同一型拥有多个实现时候,如何注入呢? 答:这种场景下,只能通过 byName 注入方式。可以使用 @Resource 或 @Qualifier 注解。        ...2、@Resource 可以通过 byName  byType方式注入, 默认先按 byName方式进行匹配,如果匹配不到,再按 byType方式进行匹配。

1.8K20

C++核心准则C.3:用表现接口实现区别

C.3: Represent the distinction between an interface and an implementation using a class C.3:用表现接口实现区别...明确地区分接口实现可以提高可读性并简化维护工作。...Data代码应该遵循以下原则:public部分只用于声明Data接口,而private部分用于Data具体实现,包括私有成员函数。成员访问权限根据是接口还是实现决定,而不是其他。...这样使用表现接口实现区别当然不是唯一方式。例如我们可以使用某个命名空间中一组独立函数,一个抽象基,或者用于表现接口包含concept参数模板函数。...最重要是在接口具体实现之间进行明确地区分。理想情况下,也是一般情况下,接口都会比实现更稳定。 译者注:concept是C++引入新特性。 Enforcement(实施建议) ???

41920

ASP.NET Core 一个接口多个实现依赖注入与动态选择

点击蓝字 关注我 ASP.NET Core 自带依赖注入(DI)非常实用,但是当一个接口有多个实现时候怎么操作呢?运行时能否根据配置选择其中一种实现呢?能不能不用反射呢?...很多小伙伴都有这样疑问。今天我带大家看看如何在ASP.NET Core里不依赖反射,根据配置文件,在运行时动态选择一个接口具体实现。 首先,这个需求其实来自我自己博客系统。...注册常规ASP.NET Core DI完全一样,我们把HelloerA及HelloerB都注册进去: services.AddTransient(); services.AddTransient...(); 构造函数注入 刚才我们注册了同一接口两套实现,那么ASP.NET Core运行时候会选择哪个实现呢?...构造函数居然还能这样注入 其实,在ASP.NET Core中,当你对一个接口注册了多个实现时候,构造函数是可以注入一个该接口集合,这个集合里是所有注册过实现

3.8K30

所有实现IAnimal接口实例对象

如果我们想要一次性将所有实现了IAnimal接口对象Cry方法实例全部执行一遍,只能一个对象一个对象初始化,然后调用cry方法。这样太麻烦,我们可以通过动态创建对象并执行对象方法来实现这个效果。...下面,我们将开始动态创建所有实现。第一步,我们需要先获取到所有实现了IAnimal实例对象。现在,我们已经得到了所有实现IAnimal接口实例对象。...我们可以使用下面的代码那么,既然不能完全禁用缓存编译优化,那如何解决可见性有序性问题呢?其实,合理方案应该是按照需要禁用缓存编译优化。什么是按需禁用缓存编译优化呢?...按照volatile会将v=true写入内存;线程B执行reader()方法,按照volatile,线程B会从内存中读取变量v,如果线程B读取到变量v为true,那么,此时变量x值是多少呢??...这个示例程序给人直觉就是x值为1,其实,x值具体是多少JDK版本有关,如果使用JDK版本低于1.5,则x值可能为1,也可能为0。如果使用1.5及1.5以上版本JDK,则x值就是1。

47040

Kotlin 匿名实现接口抽象区别详解

(holder: String, itemData: Any, position: Int) { println(holder + itemData + position) } }) 抽象:...他们之间唯一区别就是调用时下面这句,抽象多了一个括号。 object : OnBind object : AbstractOnBind() 就这么一点区别,其实本质上是完全不一样。...在实现接口时,object 代替了 java 中 new 一个对象,在这里“:“ 号后紧跟接口接口没有构造方法,代表了object实现了这个接口; 而在实现抽象时候,抽象方法后边有(),可以理解为调用了抽象方法构造方法...总结一下:为便于理解可以这么想(实际原理可能并不是这样),接口时,先有 object ,然后让 object 实现接口;抽象时,先实现抽象抽象方法,用构造方法构造出一个对象后,再给到 object...以上这篇Kotlin 匿名实现接口抽象区别详解就是小编分享给大家全部内容了,希望能给大家一个参考。

2K30

【Kotlin】接口抽象 ( 接口属性方法定义 | 接口默认方法实现 | 抽象 )

文章目录 一、接口属性方法定义 二、接口默认方法实现 三、抽象 一、接口属性方法定义 ---- Kotlin 中使用 interface 关键字 定义接口 , 接口 所有 属性 函数 默认都是...open , 在 接口 实现中 , 必须 使用 override 重写 接口 属性 函数 ; 重写 接口属性 主要是 为 该属性赋值 , 以及 设置成员属性 getter setter...默认都使用 open 修饰 ; Student 是 Person 接口实现 , 在该类中需要 使用 override 重写 接口所有的 成员属性 成员方法 ; interface Person...---- 在 Java 接口中 只能定义抽象方法 , 但是在 Kotlin 中 , 可以提供一个 默认接口方法实现 ; 在 Kotlin 接口中 , 可以 为 接口属性 提供默认 setter 实现..., 也可以 为函数提供默认实现 ; 代码示例 : 在下面的代码中 , 在 Person 接口中 , 为 name 属性 提供了 默认 getter 实现 , 为 sayHello 函数 提供了 默认函数实现

1K20

接口区别

接口(Interface)(Class)是Java中两个重要概念,它们有一些区别用途上差异,让我们来了解一下:定义:是一个具体实现,可以包含属性、方法构造函数等;而接口是一个规范、协议,...而无法直接继承接口,但可以通过实现接口来获取接口中定义方法,并对其进行实现。多实现:一个只能直接继承自一个,但可以实现多个接口。...默认实现可以直接提供方法实现,也可以调用其他方法,包括父方法。而接口只能定义方法签名,没有默认实现实现接口必须提供方法具体实现。...实例化:可以直接实例化为对象,而接口不能被实例化。接口只能被实现,并且需要通过实现接口来创建对象。...总结来说,是具体实现,可以包含属性方法,并支持继承、多态等特性;而接口是一种规范,定义了一组方法签名,通过实现接口可以为提供额外行为,增加灵活性可扩展性。

10210

Java 继承Thread实现Runnable接口区别

通过实现Runnable接口,实例化Thread     在实际应用中,我们经常用到多线程,如车站售票系统,车站各个售票口相当于各个线程。...当我们做这个系统时候可能会想到两种方式来实现,继承Thread实现Runnable接口,现在看一下这两种方式实现两种结果。...我们不妨做个比喻,其实刚程序,继承Thread,我们相当于拿出三件事即三个卖票10张任务分别分给三个窗口,他们各做各事各卖各票各完成各任务,因为MyThread继承Thread,所以在new...用图表示如下 在我们刚接触时候可能会迷糊继承Thread实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同实现多线程,一个是多个线程分别完成自己任务,一个是多个线程共同完成一个任务...其实在实现一个任务用多个线程来做也可以用继承Thread实现只是比较麻烦,一般我们用实现Runnable接口实现,简洁明了。

1.6K70

、抽象接口区别

public abstract class 名{ //可以定义所有的属性方法 //还可以定义接口常量抽象方法 } 抽象相当于融合了接口,并且它不要求继承者必须实现所有方法。...接口必须要实现其中所有抽象方法,包括接口所继承接口方法。实现抽象方法时, 必须重写抽象方法,选择继承非抽象方法。...接口可以继承接口,抽象可以继承实体,但不可以继承接口,只可以实现接口,可以不继承抽象或不实现接口声明所有方法。抽象可以在不提供接口方法实现情况下实现接口。...它需要提供接口所有声明方法实现 构造器 抽象可以有构造器 接口不能有构造器 与正常Java区别 除了你不能实例化抽象之外,它普通Java没有任何区别 接口是完全不同类型 访问修饰符...抽象侧重抽象,主要作为基,写好共性功能属性,留出抽象方法供实现接口侧重行为,规定了要实现所有方法,但所有的方法都是抽象,是对行为规范。

44910

浅析JDBC常用接口——JDBCDriver接口、DriverManager、Connection接口

二、Driver接口 1.在JDBC中,每个驱动程序一般会提供一个实现Dirver接口。当你在加载某一个Driver,它自己实例化并向DriverManager注册这个实例。...2.在上面介绍了Driver接口基础知识点,接下来,小编通过一个案例带大家一起了解加载MySQL驱动用法,代码如下所示: public class Example24 { public...五、Connection接口 1.Connection接口是用于特定数据库进行连接,在连接上下文中执行SQL语句并且返回结果。...七、总结 1.本文介绍了JDBCDriver接口、DriverManager、Connection接口。...4.介绍了Connection接口,它是用于特定数据库进行连接,在连接上下文中执行SQL语句并且返回结果。 5.希望大家通过本文学习,对你有所帮助!

1.6K40

java:基于ProxyInvocationHandler实现接口decorator pattern

关于decorator pattern概念更详细说明参见维基百科 decorator pattern(英文)或修饰者模式(中文) 可以简单理解decorator pattern是一个代理,它可以转发所有的方法请求到被代理实例...并在此基础上实现一些新特性,但对外表现上,代理与被代理行为功能是一样。设计一个代理,很简单,就是通过转发实现被代理所有方法,但如果要经常写这样代理,是件挺烦人事儿。...如果被代理是一个接口,那么完全可以基于ProxyInvocationHandler实现一个基本通用接口代理,在特定应用场景下可以省去手工写代码工作。...如下是一个基于ProxyInvocationHandler实现一个接口代理,它只是简单转发方法请求到被代理接口实例,实际使用时可以继承该类根据需要重写invoke方法来添加新行为特性. package...* @param delegate 实现接口 */ public InterfaceDecorator(Class interfaceClass, T delegate) {

55410

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券