作者achaos (热~~~~)
看板java
标题Re: [问题]没有autowired会要自己new一堆很深的建构?
时间Tue May 10 10:48:28 2022
你写的这个例子没有解耦啊! 你不解耦当然就不用建构子。
在程式中使用new去建立新的物件,那之後要替换就会变得困难。
想想看你的dao是new出来的,之後需要mock的时候,你要怎麽将dao替换成mockDAO
然後进行测试呢?
所以一个解决方式就是将需要的程式物件,透过建构子的方式注入,这个方法在单元测试
的书上常常提到
毕竟你自己new出来的物件,就会很难mock,导致单元测试案例不容易撰写。
依照你的范例,我会在 main class中将所有需要的程式物件都先建立好。
例如下列程式:
public static void main(String[] args) {
Dao11 dao11=new Dao11();
Dao22 dao22=new Dao22();
Dao1 dao1=new Dao1(dao11,dao22);
Service1 service=new Service1(dao1)
}
如果要替换成mockDAO,就统一在main class做操作就可以,不用到各个程式改。
这边也很像spring的设定档,
告诉程式目前有dao11,dao22要注入dao1,然後dao1要注入service1,
如果有需要mock或替换程式,就改设定档就可以了。
但是上述很明显的问题是,如果一旦Service1需要多个依赖程式,你的建构子就需要一直
变化,并且一直增长。
变成类似 service1 service=new Service1(dao1,dao2,dao3....daoN) 这种写法。
因此才有了DI框架(例如Spring)来解决这个问题,
他会像main function一样,先将需要的程式new出来
(例如dao11,dao22) 然後帮你设定到dao1,再将dao1设定到service1里面。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.230.37.43 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1652150910.A.29E.html
3F:→ ntpuisbest: 透过建构子来做Di我可以理解,但你可以提供给我一个 05/10 11:41
4F:→ ntpuisbest: 例子,失去了autowired之後,我就无法使用new Service 05/10 11:41
5F:→ ntpuisbest: ()空的建构子来new出我的物件吗? 05/10 11:41
8F:→ ntpuisbest: 这样大概知道你的意思了 05/10 20:00