请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于在spring中具体调用哪个服务类的问题

老师,我想问一个问题。比如说定义了泛型接口A,里面有些功能A1,然后定义了泛型接口B继承了A的接口,里面有另外新的功能B1,然后又有新的类C1实现了B接口中的所有方法(包括A1,A2)及自己另外的方法,最后又有D1类 继承C1,E1类继承D1。E1被@Service修饰,它应该被装载到容器中了,现在我在某个controller中获取到B<具体类型>的引用,并调用B1中一个函数,那这个函数被调用到底是通过C1<具体类型>调用 的函数通过E1这个被装载的服务调用的呢?图片描述

正在回答

1回答

同学好,信息可能不是很全,首先B是不被@Service修饰的吧,那使用的时候,如果依赖Spring注入肯定是没法注入B,只能说是注入E,那么除非是new B这样写死,如果通过@Autowired的话肯定是使用E的方法

0 回复 有任何疑惑可以回复我~
  • 提问者 慕设计0394643 #1
    背景是:A接口定义的是CRUD抽象函数,B接口定义的是列表,页查询抽象函数,C类定义的是上面接口的实现,D类定义的是审计的函数(A,B,C,D都通过泛型定义),E定义的是具体的业务Service。基本结构是这样的,只有E是具体的业务Service,加了@Service的注解。业务controller调用基本的crud方法时,经过剖析发现,最终调用的是B接口的抽象方法(即返回的是B<指定类型>这个service来调用里面的某个crud函数),在业务controller中该E被@Autowired注解了,同时A,B,C均没有加入任何注解,除了重写的方法。如果通过E的Service来调用的话,也是调用的继承来自C的实现方法吗?另外还想知道,这个背后实质是在调用B接口的抽象方法时,spring容器会找相关类型的具体实现类,然后调用其方法吗?扩展这个问题的话,那如果有多个实现类都被加载到容器,调用此接口的抽象方法,怎么确定到底调用是哪个实现类的方法呢?这里有三个疑惑,感谢老师解答!
    回复 有任何疑惑可以回复我~ 2021-08-18 09:06:28
  • 翔仔 回复 提问者 慕设计0394643 #2
    同学好,肯定是的,同学可以看看继承的原理,实际上会使用的是C的实现方法的。背后的实质其实利用的是继承关系,创建好E实例本身就具备C的实现方法了,毕竟不是组合而是继承,同学可以直接在不依赖spring的基础上,写写几个继承的例子就理解了。如果同时多个实现类实现同一个方法,需要指定一个实现类(加上@Primary标签),作为该方法的实现类
    回复 有任何疑惑可以回复我~ 2021-08-18 23:46:25
  • 提问者 慕设计0394643 回复 翔仔 #3
    嗯嗯,主要是这个接口没有通过new子类来实例化,我就有点疑惑到底通过这个接口调用的方法是怎么调用的,关键原因是E被@Service注入了吧,相当于B<指定类型> 的接口的service引用的是 E这个子类的实际类型,然后再调用的是E继承自C的方法。
    回复 有任何疑惑可以回复我~ 2021-08-19 09:21:32
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信