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

Spring:为什么我们要autowire接口而不是已实现的类?

辛才俊
2023-03-14
interface IA
{
  public void someFunction();
}

@Resource(name="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}

@Resource(name="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{

  @Autowire
  @Qualifier("b") 
  IA worker;

  worker.someFunction();
}
    null

共有1个答案

凌意
2023-03-14

spring如何知道使用哪个多态类型。

只要接口只有一个实现,并且该实现使用@component注释,并启用Spring的组件扫描,Spring框架就可以找到(接口,实现)对。如果未启用组件扫描,则必须在application-config.xml(或等效的spring配置文件)中显式定义bean。

我需要@qualifier还是@resource?

一旦有了多个实现,就需要对每个实现进行限定,并且在自动布线过程中,需要使用@qualifier注释来注入正确的实现,以及@autowired注释。如果您使用@resource(J2EE语义),那么您应该使用这个注释的name属性指定bean名称。

为什么我们要autowire接口而不是已实现的类?

首先,通常为接口编写代码总是一个很好的做法。其次,在spring的情况下,您可以在运行时注入任何实现。一个典型的用例是在测试阶段注入模拟实现。

interface IA
{
  public void someFunction();
}


class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

您的bean配置应该如下所示:

<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />

或者,如果在存在组件扫描的包上启用了组件扫描,则应该使用@component限定每个类,如下所示:

interface IA
{
  public void someFunction();
}

@Component(value="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


@Component(value="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

@Component    
class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

然后,MyRunner中的worker将注入B类型的实例。

 类似资料:
  • 问题内容: 仅仅是因为动态类型,我们不需要python中的接口概念(例如Java和C#)吗? 问题答案: 将 作为关键字和神器是在Java引入1(和C#把它从那里)来描述一下合同的对象必须坚持为。 但是,接口一直是面向对象范例的关键部分,基本上它表示对象必须响应的方法。Java只是强制执行此机制以提供静态类型检查。 因此,动态(OO)编程语言 确实会 使用接口,甚至认为它们不会静态检查它们。就像其

  • 我正在从这个url阅读Spring Hibernate CRUD教程 http://viralpatel.net/blogs/spring3-mvc-hibernate-maven-tutorial-eclipse-example/ 请任何人告诉我为什么在ContactController中。java,接口是自动连接的,而不是类ContactServiceImpl。 类似地,在接口被注入。我们不应

  • 我只需要一些关于java中标记接口的澄清。我读到它在java中是一个空接口。我只想知道为什么以及在哪里我们需要使用这个。有人能帮忙吗?

  • 问题内容: 使用JDBC连接池工具(如DBCP或c3p0)有什么好处? 如果只有 一个* 用户的 小型CRUD 应用程序,我们是否可以将 一个 连接会话创建为一个 单例 ? * PS :我正在构建一个带有小型数据库(5个表)的小型后端应用程序。 问题答案: 从Jon Skeet的答案到连接和语句池的好处是什么?: 创建到数据库服务器的网络连接是(相对)昂贵的。同样,要求服务器准备SQL语句(相对)

  • 问题内容: 我不知道您是否认为这是一个重要问题,但我想知道。float是一个浮点数(4个字节)。double是浮点数(8个字节)。为什么我们定义双重假名铸造: 但是我们需要使用浮点数进行转换: 要么 先感谢您。 问题答案: 如果浮点文字以字母或结束,则其类型为float 。否则,其类型为,并且可以选择以字母或结尾。 浮点类型(和)也可以使用E或e(对于科学记数法),或(32位浮点文字)和或(64位