当前位置: 首页 > 知识库问答 >
问题:

java - Spring 注入interface的bean和注入实现类的bean,有什么不一样?

盖斌
2023-05-13

一、注入实现类的bean(控制台展示的结果符合预期)

二、注入interface的bean

三、背景
在实现 设计模式 -> 工厂模式 -> 工厂方法模式。准备了 工厂的interface和产品的interface。通过工厂返回对应的、需要的产品。

四、问题
1、学spring的时候,就是注入interface,根据bean的名字找到对应的实现类,如图,我已经指定了是interface的bean是smallFactory,为什么返回的是一个Object对象而不是我在interface/实现类里声明的IFactoryMethodService?
2、注入interface的bean和注入实现类的bean,有什么不一样?我在查到的资料都是比较深入,涉及到AOP、增强、cglib之类的,有没有直接一点的体现?

很早之前学的spring,有点忘了这些细节,请大神指点下,谢谢

共有1个答案

牛华皓
2023-05-13

问题一:

  1. 注入实现类,语法检查按照实现类的方法定义来,返回类型是个很具体的类,所以两个类型能对上;
  2. 注入接口的时候,看你给出来的代码,猜测你接口定义应该是使用了泛型,语法检查是按照接口的返回类型来判断,如果是泛型的话,那默认是Object,两个对不上。
  3. 简单点说,注入接口,语法检查只会看到接口层,不会去看实际实现,实际上也不应该看实际的实现,因为同一个接口可以有很多种实现,具体是由运行时的配置,来选择具体使用哪一个实现。

然后关于问题二:
不讨论设计理论,就实用角度,同一个接口,如果有多个实现的时候

  1. 注入接口,如果不通过注解一类的明确某个具体实现,那spring实际会给你一个所有实现的List,你需要用List的方式来autowire,否则的话会报错,该接口有多个实现类,然后通过list,可以在代码里面,通过instance of一类的方式,来选择具体的实现
  2. 注入实现,那实际和接口没有关系,就是注入了一个具体的类,该怎么用就怎么用,相对接口,在灵活性上就差很多了
  3. 举个例子,比如我需要同时对飞书,企业微信,钉钉三个渠道发送告警,可以定义一个告警接口包含一个告警方法,然后3个渠道分别实现,在业务代码中,注入一个接口的List,然后循环List元素,调用告警方法,就可以了; 如果后续有第四种渠道,只需要增加实现,不需要修改业务代码。相对的如果是注入实现,那就需要业务代码注入3个实现,然后写三次调用方法,后续增加新的,也需要修改业务代码。
 类似资料:
  • 我有一个类BusinessRowMapper,它实现了将PostGres JSONB对象转换为Java对象的RowMapper。 它覆盖mapRow 现在,我如何在这个BusinessRowMapper Bean中进行PersonUtility Bean的Spring管理注入,而不是将实用程序Bean作为构造函数参数传递给BusinessRowMapper?

  • 问题内容: 是否可以将Spring bean注入RestEasy @Path类中?我设法通过Jersey并使用@InjectParam注释完成了此操作,但是由于某些其他原因,我需要切换到RestEasy,而且我似乎找不到解决方法(尝试了javax.inject.Inject,但没有)。 编辑 此解决方案有效:http : //www.mkyong.com/webservices/jax-rs/re

  • 主要内容:构造函数注入,setter 注入,短命名空间注入所谓 Bean 属性注入,简单点说就是将属性注入到 Bean 中的过程,而这属性既可以普通属性,也可以是一个对象(Bean)。 Spring 主要通过以下 2 种方式实现属性注入: 构造函数注入 setter 注入(又称设值注入) 构造函数注入 我们可以通过 Bean 的带参构造函数,以实现 Bean 的属性注入。 使用构造函数实现属性注入大致步骤如下: 在 Bean 中添加一个有参构造函数,构造

  • 问题内容: 我已经用spring和spring security开发了一个简化的Web应用程序…现在,我想添加ejb模块来进行数据库访问,我在Internet上查找,但是由于它是我第一次使用EJB,所以我没有找到明确的东西。我想在控制器中使用类似@EJB之类的东西” 以及在有教程或其他帮助的情况下如何在Spring上下文中对其进行配置。很好,谢谢 问题答案: 要将ejb 3 bean注入sprin

  • 我正在使用Spring Framework/Data/HATEOAS,并试图添加dozer。 和以下汇编程序: 所以,-我对豆子和注射很陌生-但我想工厂的豆子是?应该?来注入映射器。但是映射器肯定是空的。我知道我做得不对,但我做错了什么?

  • 我正在开发一个遗留的JSF应用程序,我们正在慢慢地将其移植到Spring MVC。我们正在使用Spring Security来控制登录信息。在用户登录之后,JSF页面全局地实例化一个在任何地方都使用的会话作用域bean。我想更改应用程序,这样我们就可以先进入用Spring MVC开发的页面。 我尝试的一种方法是将bean转换为spring bean,并将其注入JSF,但不幸的是,这需要对bean进