作者lovdkkkk (dk)
看板Soft_Job
标题Re: [请益] Spring boot的依赖注入降低耦合的例子
时间Fri Apr 1 23:31:00 2022
来补一下 "如何验证效果" 的部份
首先假设情境, A 是你的 Web App
B 是那个要被 Spring 注入的东西, 假设在 "外部" "其它人开发的 jar" 里面
验证的项目
1. B "改变" 时, A 需要做哪些事?
ex: B 的 package 名改了,
A 要?
1-1. 什麽都不用做只要改 springboot config,
1-2. 要改 code,
1-3. 要重新 build
2. 要将 A 中的 B 替换成 C/D/E 时, 需要做哪些事?
2-1. 什麽都不用做只要改 springboot config,
2-2. 要改主程式里的 import 并重 build
2-3. 要改很多档案里的 import 叙述并重 build
2-4. 甚至还要改一卡车方法名, 连带的传入参数类型, etc
然後想想看, 假如 A 是你在维护, 然後发生第 1 点的状况
或者 A 是你买来的系统, 然後你想做第 2 点的事情如换个资料库、换个连线 lib
或者你想在 B 没完工确定前先写测试测 A 的流程跟逻辑
是能自己很容易做到, 还是得请原开发者帮忙甚至再重出一版
把各种做法, 包括
直接依赖实体、A/B 都依赖於 A 中所定义的介面、
使用 Spring 注入, 在主程式自己 new 自己塞等等,
通通用上面几项确认一下, 大概就知道效果在哪了
--
很久没写 Java 插个花科科
※ 引述《ntpuisbest (阿龙)》之铭言:
: 推文有个连结有解答我的疑惑
: 感谢bron大
: 文章有点长
: 先说说我对依赖注入的理解
: 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), 来自: 114.37.200.216 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1648827062.A.C39.html
1F:推 yupog2003: 这篇对我来说很好懂 04/02 08:53
2F:推 s06yji3: thanks 04/03 10:44