Java中的多态1
0.背景
我们熟知,Java语言的三大基本特性为:继承、封装与多态.
简单的来说,Java通过在运行时使用不同的实现,达成了多态这一特性.
举个简单的例子:
...
1.设计
...
2.实例分析
2.1 SpringBoot中的@Service注解
在一开始,我们准备设计一个向Admin用户推送消息的服务.
我们先设计出一个接口.
接着,我们完成这个接口的一个实现,在实现类上加上注解@Service
在Controller中,我们触发这个服务.
注意,此时我们在controller中并不是使用PushServiceImpl这个具体实现来调起pushToAdminUser()方法,而是使用的他的父接口,即:
当然,你也可以这样写:
现在问题来了,为什么建议使用pushService来调用方法?即业内的那句"面向接口编程".
"开闭原则":软件应当对扩展开放,对修改关闭.
简单的理解,就是不要去动以前的代码,即我写好了pushToAdminUser()这个方法后,就不要再去乱改它的代码了.
现在可能看起来没啥复杂的业务逻辑,但是在实际开发中,可能连搞清楚这个方法是干嘛的都很困难.
实际开发中,你也会发现,让你自己新写一个类很舒服,因为都是自己写的,你很自信.
但是让你去修改别人的代码,你可能就会犯难了,哪怕是以前自己写的代码,因为你不知道随便改改可能会出现什么bug.
秉着不伤害原来程序的原则,我们尽量去新加代码,不动原来的,这样即使出问题,原来的功能也很好恢复.
所以,在这里,我们将接口作为变量类型,传入方法的具体实现中,在使用时该接口的具体实现类是谁,程序的功能就会随之改变.
你可能会疑惑,我这里没有指明这个PushService的具体实现类啊,它运行的时候怎么知道实现类是谁?
还记得你在PushServiceImpl加上了@Service这个注解吗,这个就表明了运行时PushService使用PushServiceImpl这个实现.
我们可以简单推测一下,在Controller加载时,Spring扫描到@Autowired注解,尝试去实例化PushService这个成员变量.
接着,它发现这是个接口,这玩意好像不能实例化啊?我去找找它的实现类吧.
然后,它尝试着去寻找它的实现类,记录下使用了@Service的这个实现类,对它做了实例化,并赋值给PushService这个变量.
当我写了多个实现时,都加上@Service注解,它又怎么知道选哪个?
比如我们再新加一个PushServiceImpl2实现类.
在它没有加上@Service注解前,Spring知道,运行时我选择有@Service注解的那个,即上面的PushServiceImpl.
如果你使用的是IDEA,此时你点击前面的引导标记,也会自动跳转到具体的实现PushServiceImpl.
当你为PushServiceImpl2也加上@Service注解后,你会发现,IDEA并不能帮助你跳转了,同时,可恶的红色波浪线也出来了.
IDEA都这样提醒你了,你还去启动程序?启动后便开始给你报错.
描述的很简洁:
- 咱这是单例bean,你给了我两个选择啊?
- 用下@Primary,改成原型bean,又或者用用@Qualifier?
所以你可以尝试:
-
在你想要的实现类前加上@Primary
-
在变量PushService上加上@Qualifier
如果你闲的无聊,用@Primary和@Qualifier分别注解两个不同的,你会发现@Qualifier处的优先级更高.
你也可以猜想下单例bean与原型bean的实现,下面是曾经仿照的一个简单版demo.
2.2 场景分析
__EOF__

本文链接:https://www.cnblogs.com/yang37/p/15404558.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具