Fw: [请益] Spring boot的依赖注入降低耦合的例子

楼主: ntpuisbest (阿龙)   2022-03-31 22:12:12
※ [本文转录自 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
作者: Keade0325 (pinpin)   2021-03-31 21:27:00
当有需要抽换实作的时候
作者: MoonCode (MoonCode)   2021-03-31 21:29:00
在你理解前应该先完全不靠 spring 的功能,只靠 java本身来做依赖注入,然后判断有没有真的有效就是你的类可以把依赖的东西改用mock替换。那等你都弄好后开始不断的堆积业务逻辑时,就会发现初始化的地方会有一堆 new constructor 然后再传进另一个 new constructor,那这时候一个像 spring 这样的框架就可以用各种方式来帮助你避免自己写这些 new,就可以避免一些麻烦。 但我是喜欢自己手动操作啦,靠框架的话整个生命周期很难看懂。
作者: wulouise (在线上!=在电脑前)   2021-03-31 21:33:00
我觉得任何DI framework都跟singleton 87%像邪恶
作者: illya65536 (illya65536)   2021-03-31 21:35:00
个人觉得方便测试时去 mock,平常用 Laravel 的经验
作者: bheegrl   2021-03-31 21:39:00
Polymorphism通常是autowired interface啦,再依参数配置决定要使用
作者: Keade0325 (pinpin)   2021-03-31 21:43:00
简单的例子就是更换DB driver
作者: bheegrl   2021-03-31 21:44:00
哪个实作上面那interface的component
作者: bronx0807 (坚持需要练习)   2021-03-31 22:00:00
@Autowired只是依类名或型别帮你在Spring容器生物件DI与IoC才是低耦合的关键,与@Autowired无关
楼主: ntpuisbest (阿龙)   2021-03-31 22:03:00
可是如果DI要我自己写的话,Spring帮我做了啥,单纯的控制反转有降低耦合吗?
作者: bronx0807 (坚持需要练习)   2021-03-31 22:04:00
Spring帮你new物件并注入到使用的对象属性中还有上面Dao1 Dao2例子有误,DI是从外面set进来
楼主: ntpuisbest (阿龙)   2021-03-31 22:07:00
我的第一个例子应该是DI吧,把ADDRESS注入到Employee当中即使用Spring,不用自己写new,可是建构子还是要自己写阿,降低了什么功夫呢
作者: bronx0807 (坚持需要练习)   2021-03-31 22:10:00
帮你搞定层层的依赖关系你可以试试不用Spring自己写依赖注入,你就知道差异
作者: ssccg (23)   2022-04-01 10:17:00
field宣告可以用interface,不用实际的class,才有降低耦合通常实际class并没有降低耦合,只是省掉自己初始化整个物件结构的工(spring bean默认的scope是application scope,也就是整个ApplicationContext里只会new一次,在有很多bean的app里面要达到一样的效果要多写很多程式码,可不只是在宣告处new就好),等哪天真的有需要降低耦合,用refactor工具把interface抽出就好
楼主: ntpuisbest (阿龙)   2022-04-02 17:41:00
TY FOR JAVA AND SOFTJOB

Links booklink

Contact Us: admin [ a t ] ucptt.com