一直不理解 SpringBoot 使用注解来控制装配怎么就解耦了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huang1002788835
V2EX    Java

一直不理解 SpringBoot 使用注解来控制装配怎么就解耦了

  •  
  •   huang1002788835 2023-07-10 23:13:46 +08:00 3205 次点击
    这是一个创建于 838 天前的主题,其中的信息可能已经有所发展或是发生改变。
    @Autowired @Qualifier("InterfaceImpl_1") MyInterface interfaceImpl_1; MyInterface aa = new InterfaceImpl_1(); 

    如果一个接口有不同的实现类还是要在注上指定注入的实现类

    这样子和直接用 new 创建一个对象有什么区别呢?如果更改实现类还是要直接修改代码

    我感觉上面两种方法耦合程度都是一样的

    14 条回复    2023-07-11 18:37:27 +08:00
    foolishcrab
        1
    foolishcrab  
       2023-07-11 00:22:54 +08:00 via iPhone   1
    一个工具解决的不是你当前的场景,不代表它没有用

    谷歌一下 ioc 有什么用不好吗
    levon
        2
    levon  
       2023-07-11 01:08:40 +08:00
    如果是动态的呢
    chendy
        3
    chendy  
       2023-07-11 08:24:12 +08:00
    直接 new 的时候,相当于两个类有直接的依赖,如果实现类不存在直接无法编译
    用注解配置的依赖注入,class 之间没有直接依赖,可以按需替换成其他实现类对象
    另外这玩意不仅可以注入 MyInterface 甚至能注入 List<MyInterface>

    不过不理解也没啥问题,因为做需要 interface + 多实现 的场景其实并不多,但是一旦需要,这个特性就非常有用了
    tedzhou1221
        4
    tedzhou1221  
       2023-07-11 08:36:24 +08:00
    #3 说的很对。除了注入 List<MyInterface> ,还可以做注入 Map<String,MyInterface> 我一般是 做策略模式 用的比较多
    NizumaEiji
        5
    NizumaEiji  
       2023-07-11 08:50:45 +08:00   1
    你的实现类有没有可能还依赖其他的实现类
    LeegoYih
        6
    LeegoYih  
       2023-07-11 09:04:10 +08:00
    它给了你这种选择,你可以根据自己的情况选择使用。
    一般多实现类要么用工厂,要么就全部调用。

    @Autowired
    WebhookFactory webhookFactory;
    webhookFactory.get(name).doSomething();

    @Autowired
    List<Webhook> webhooks;
    for (Webhook webhook : webhooks) {
    webhook.doSomething();
    }
    jump2cn
        7
    jump2cn  
       2023-07-11 09:10:48 +08:00
    例如你有个需求,要对同一个类型的数据做 3 种不同的算法,未来可能还需要加好几种. 是写个方法一直 switch 、if else 再 new 一下比较容易维护还是通过注入维护省事
    dddd1919
        8
    dddd1919  
       2023-07-11 09:26:34 +08:00
    假设你这里的代码被调用 10 次,使用 @Autowired 和 @Quailfier 是依赖 IOC 重复使用容器创建的同一份实例,你自己 new 的话需要创建 10 次新实例,两个注解就是单例+工厂模式结合的一次最佳实践
    v2e0xAdmin2
        9
    v2e0xAdmin2  
       2023-07-11 09:44:25 +08:00
    以前用的是 xml 配置文件,确实是解耦的,只不过 spring 太舒服,大家觉得不用解耦,以后就用这个了,就出现了使用注解代替 xml 了,也就不“解耦”了。
    luckylvke
        10
    luckylvke  
       2023-07-11 10:23:03 +08:00
    那你可能没有深刻理解“依赖”的含义。。。
    jimrok
        11
    jimrok  
       2023-07-11 13:12:33 +08:00   1
    我觉得你说的没毛病,提出这种质疑非常合理。一个软件,少则几个模块,多则几十个模块,很多模块设计出来就不一定会有替换的。系统开始构建的时候,一部分人并不会仔细考虑或者设计系统模块之间的依赖关系,或者这个解耦的作用是什么,怎样利用这个解耦去做测试设计。都是无脑的走 Spring style ,先写个 Autowried ,反正后面写个类实现了就完事了。什么情况用 new 来注入,什么情况走 Autowried 或者配置文件注入,边界在那里,需要做这部分的人有架构的四维,站在模块级别的高度去看系统。
    banmuyutian
        12
    banmuyutian  
       2023-07-11 14:50:59 +08:00
    把 Spring 想象成一个大工厂就好了,工厂模式怎么解耦的 Spring 就怎么解耦……
    yuk1no
        13
    yuk1no  
       2023-07-11 16:54:21 +08:00 via iPhone
    你说的很对 很多人不懂装懂 只知道跟风 像 op 这样独立思考的人不多了
    CloudSen
        14
    CloudSen  
       2023-07-11 18:37:27 +08:00 via iPhone
    首先 DI 是 DI ,IOC 是 IOC 。
    你说的这个场景,并不能代表所有吧,更多是用法和代码设计的问题?
    下面这三个场景用处更大好么?
    1. 注入列表
    2. 注入 map
    3. 用 @Conditional 相关的条件注解,实现根据配置动态装配
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     865 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 20ms UTC 19:44 PVG 03:44 LAX 12:44 JFK 15:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86