java 板


LINE

※ [本文转录自 Soft_Job 看板 #1YHQT2E2 ] 作者: ntpuisbest (阿龙) 看板: Soft_Job 标题: [请益] Spring boot的依赖注入降低耦合的例子 时间: Thu Mar 31 21:06:08 2022 文章有点长 先说说我对依赖注入的理解 Spring boot 依赖注入大致有三种方式 透过建构子的 透过setter的 或是 field 这三种都可以透过@Autowired注解来达到依赖注入的效果 我自己想到的建构子的举例是 假设有两个类 Address 和 Employee好了 1. public class Address { String Country; String City; String Street; public Address(String country, String city, String street) { Country = country; City = city; Street = street; } } 2. public class Employee { String sex; String name; Address address; // 没有依赖注入的方式 public Employee(String Country,String City,String Street,String sex, String name ) { this.sex=sex; this.address = new Address( Country, City,Street ); this.name=name; } // 有依赖注入的方式 public Employee(String sex, String name, Address address) { this.sex = sex; this.name = name; this.address = address; } } 在上面的例子当中可以发现,如果哪一天 Address这个类新增了一个属性叫 phoneNumber好了 没有依赖注入的方式,必须要更改 Employee 的 this.address =new Address(Country,City,Street,phoneNumber) 而有依赖注入的方式确实降低了耦合 因为他不用更改Employee的建构方式 所以我理解依赖注入可以降低耦合 所以我理解依赖注入可以降低耦合 所以我理解依赖注入可以降低耦合 但我的问题是Spring boot 的 autowird annotation 有帮助我们降低耦合吗 在常见的开发中 我们经常都会有 Dao 以及 Service 假设我有两个 Dao 好了 分别是 Dao1 和 Dao2 以及一个Service Dao1 public class Dao { public void sayhi() { System.out.println("hello"); } } Dao1 public class Dao { public void sayhi() { System.out.println("hello"); } } Dao2 public class Dao2 { public void saygoodbye() { System.out.println("say goodbye"); } } 如果我不在service上面使用autowired 我的service会是 public class Service { Dao1 dao=new Dao1(); Dao2 dao2=new Dao2(); public void sayhi() { dao.sayhi(); } public void saygoodbye() { dao2.saygoodbye(); } } 如果我使用了@Autowired注解 那我只是将 Dao1 dao=new Dao1(); Dao2 dao2=new Dao2(); 替换成 @Autowired Dao1 dao @Autowired Dao2 dao2 我想请问所以我使用了Autowired注解 我知道我可以不需要使用new 来建构实体 但 Spring 真的有帮我降低耦合吗 即使我换成 setter 配合 autowired的方式好了 那个 setter也是要我自己去撰写 Spring 帮我降低了耦合甚麽? 我的问题简单来说就是 我知道依赖注入可以降低耦合 但Spring boot透过 @Autowired注解帮我降低耦合在哪 谢谢 p.s 因为面试的时候常常被面试官问说懂不懂甚麽是 控制反转还有DI,我基本上举例都举 Address还有 Employee的例子 但当我反问下面例子的时候,他们好像也说要再回去想一下... 只有其中一个就说更复杂的例子会用到,但也没说甚麽是更复杂的例子QQ --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.167.157.11 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1648731970.A.382.html ※ 编辑: ntpuisbest (49.216.186.239 台湾), 03/31/2022 21:14:38
1F:推 Keade0325: 当有需要抽换实作的时候 03/31 21:27
2F:推 MoonCode: 在你理解前应该先完全不靠 spring 的功能,只靠 java 03/31 21:29
3F:→ MoonCode: 本身来做依赖注入,然後判断有没有真的有效就是你的类 03/31 21:29
4F:→ MoonCode: 可以把依赖的东西改用mock替换。那等你都弄好後开始不 03/31 21:29
5F:→ MoonCode: 断的堆积业务逻辑时,就会发现初始化的地方会有一堆 n 03/31 21:29
6F:→ MoonCode: ew constructor 然後再传进另一个 new constructor,那 03/31 21:29
7F:→ MoonCode: 这时候一个像 spring 这样的框架就可以用各种方式来帮 03/31 21:29
8F:→ MoonCode: 助你避免自己写这些 new,就可以避免一些麻烦。 但我是 03/31 21:29
9F:→ MoonCode: 喜欢自己手动操作啦,靠框架的话整个生命周期很难看懂 03/31 21:29
10F:→ MoonCode: 。 03/31 21:29
11F:推 wulouise: 我觉得任何DI framework都跟singleton 87%像邪恶 03/31 21:33
12F:推 illya65536: 个人觉得方便测试时去 mock,平常用 Laravel 的经验 03/31 21:35
13F:→ bheegrl: Polymorphism 03/31 21:39
14F:→ bheegrl: 通常是autowired interface啦,再依参数配置决定要使用 03/31 21:42
15F:推 Keade0325: 简单的例子就是更换DB driver 03/31 21:43
16F:→ bheegrl: 哪个实作上面那interface的component 03/31 21:44
17F:→ bronx0807: @Autowired只是依类名或型别帮你在Spring容器生物件 03/31 22:00
18F:→ bronx0807: DI与IoC才是低耦合的关键,与@Autowired无关 03/31 22:01
19F:→ ntpuisbest: 可是如果DI要我自己写的话,Spring帮我做了啥,单纯 03/31 22:03
20F:→ ntpuisbest: 的控制反转有降低耦合吗? 03/31 22:03
21F:推 bronx0807: Spring帮你new物件并注入到使用的对象属性中 03/31 22:04
22F:→ bronx0807: 还有上面Dao1 Dao2例子有误,DI是从外面set进来 03/31 22:05
23F:→ ntpuisbest: 我的第一个例子应该是DI吧,把ADDRESS注入到Employee 03/31 22:07
24F:→ ntpuisbest: 当中 03/31 22:07
25F:→ ntpuisbest: 即使用Spring,不用自己写new,可是建构子还是要自己写 03/31 22:08
26F:→ ntpuisbest: 阿,降低了什麽功夫呢 03/31 22:08
27F:→ bronx0807: 帮你搞定层层的依赖关系 03/31 22:10
28F:→ bronx0807: 你可以试试不用Spring自己写依赖注入,你就知道差异 03/31 22:10



※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: ntpuisbest (118.167.157.11 台湾), 03/31/2022 22:12:12
29F:→ ssccg: field宣告可以用interface,不用实际的class,才有降低耦合 04/01 10:17
30F:→ ssccg: 通常实际class并没有降低耦合,只是省掉自己初始化整个物件 04/01 10:18
31F:→ ssccg: 结构的工(spring bean预设的scope是application scope,也 04/01 10:19
32F:→ ssccg: 就是整个ApplicationContext里只会new一次,在有很多bean的 04/01 10:20
33F:→ ssccg: app里面要达到一样的效果要多写很多程式码,可不只是在宣告 04/01 10:21
34F:→ ssccg: 处new就好),等哪天真的有需要降低耦合,用refactor工具 04/01 10:22
35F:→ ssccg: 把interface抽出就好 04/01 10:23
36F:→ ntpuisbest: TY FOR JAVA AND SOFTJOB 04/02 17:41







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP