Re: [問題]沒有autowired會要自己new一堆很深的建構?

看板java作者 (熱~~~~)時間2年前 (2022/05/10 10:48), 編輯推噓2(206)
留言8則, 1人參與, 2年前最新討論串2/3 (看更多)
你寫的這個例子沒有解耦啊! 你不解耦當然就不用建構子。 在程式中使用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://www.ptt.cc/bbs/java/M.1652150910.A.29E.html

05/10 11:39, 2年前 , 1F

05/10 11:39, 2年前 , 2F

05/10 11:41, 2年前 , 3F
透過建構子來做Di我可以理解,但你可以提供給我一個
05/10 11:41, 3F

05/10 11:41, 2年前 , 4F
例子,失去了autowired之後,我就無法使用new Service
05/10 11:41, 4F

05/10 11:41, 2年前 , 5F
()空的建構子來new出我的物件嗎?
05/10 11:41, 5F

05/10 20:00, 2年前 , 6F

05/10 20:00, 2年前 , 7F

05/10 20:00, 2年前 , 8F
這樣大概知道你的意思了
05/10 20:00, 8F
文章代碼(AID): #1YUT9-AU (java)
文章代碼(AID): #1YUT9-AU (java)