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

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

二、注入interface的bean

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

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

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


回答:

问题一:

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

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

  1. 注入接口,如果不通过注解一类的明确某个具体实现,那spring实际会给你一个所有实现的List,你需要用List的方式来autowire,否则的话会报错,该接口有多个实现类,然后通过list,可以在代码里面,通过instance of一类的方式,来选择具体的实现
  2. 注入实现,那实际和接口没有关系,就是注入了一个具体的类,该怎么用就怎么用,相对接口,在灵活性上就差很多了
  3. 举个例子,比如我需要同时对飞书,企业微信,钉钉三个渠道发送告警,可以定义一个告警接口包含一个告警方法,然后3个渠道分别实现,在业务代码中,注入一个接口的List,然后循环List元素,调用告警方法,就可以了; 如果后续有第四种渠道,只需要增加实现,不需要修改业务代码。相对的如果是注入实现,那就需要业务代码注入3个实现,然后写三次调用方法,后续增加新的,也需要修改业务代码。

以上是 Spring 注入interface的bean和注入实现类的bean,有什么不一样? 的全部内容, 来源链接: utcz.com/p/945163.html

回到顶部