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

作者: ntpuisbest (阿龍)   2022-05-09 01:04:49
之前問過類似的問題
大概知道了autowired的好處
比如說
Spring @Autowired 搭配 @Qualifier 指定注入的Bean
重點在 依賴於介面 而不依賴於實作
這樣抽換的時候就會方便很多
但是還是有一個地方不太懂
就是說如果有層層的依賴關係的話
沒有autowired就會出現 一層層的new 建構子出現
但是我自己舉了幾個例子
並沒有出現一層層 new的建構子
之前軟體版有人回答過我,但是那連結已經失效了QQ
假設Service1 依賴於 Dao1 ,Dao1又依賴於Dao11和Dao22好了
以下是我的測試CODE
1. Dao11
public class Dao11 {
public void sayhi() {
System.out.println("hi");
}
}
2.Dao22
public class Dao22 {
public void sayhi2() {
System.out.println("hi fomr dao22");
}
}
3. Dao1
public class Dao1 {
// private Dao11 dao11;
Dao11 dao11=new Dao11();
Dao22 dao22=new Dao22();
public void sayhifromDao1() {
dao11.sayhi();
dao22.sayhi2();
}
}
4. Service1
public class Service1 {
Dao1 dao1=new Dao1( );
public void sasdf() {
dao1.sayhifromDao1();
}
}
5. Main Class
public class MainDriver {
public static void main(String[] args) {
Service1 service=new Service1();
service.sasdf();
}
}
我的疑惑是不管我的Service依賴了幾層東西
最後都是非常乾淨清爽的
一行 new Service1 ();
並且是空的建構子,就可以做到
那這樣就我的理解,是不是只要我沒有宣告
field在class裡面
意思就是我沒有宣告
// private Dao11 dao11; 在Dao1 裡面
不管我的Service1 依賴多少東西 ,最後都可以用空的建構子new出來
並且保證功能正常運行
第二個問題是
怎麼樣造出那些
真的會有需要 層層 new的例子
這方面想不太出來
謝謝JAVA版
這幾天又一直瘋狂糾結這件事....
作者: ssccg (23)   2022-05-09 04:46:00
你只用你自己寫的程式當然覺得都用無參數建構子就好假設你的Dao需要個一定得從外面傳進來的DataSource勢必要改成這一串相依類別的建構子都要有DataSource參數「所有類別都能用無參數建構子new出來」是你一廂情願的想法就算不用依賴注入,把Dao的new直接寫在Service的裡也不是好事,這代表Dao的建構子一改你所有new到他的Service都要改這就是直接依賴實作的問題,即使沒有特別抽出interface,只呼叫public method是只依賴於介面,呼叫到建構子是綁死實作
作者: ntpuisbest (阿龍)   2022-05-09 08:38:00
晚點來看一下Data source例子,謝謝
作者: ssccg (23)   2022-05-09 21:17:00
你在你的Dao裡面是要怎麼呼叫getDatasource?那個getDatasource不是getter,是定義一個Bean (由spring的ApplicationContext管理的物件),spring的@Autowired或其他注入方式並不是找任意類別,只會從ApplicationContext中註冊的Bean裡找名稱/類別/Qualifer符合的先不談spring怎麼做的,先集中在你一開始的問題,所以你把你的Service、Dao1、Dao11寫好了,現在Dao11裡面要這個DataSource,你main裡只有Service1 service=new Service1()你要怎麼改?是說你問法很像只有在找範例讀、寫些只有sout的測試,建議先找個題目寫個會動的系統,真正用過這些功能再問工具是解決問題用的,你沒有問題要解決,拿著工具再怎麼問它哪裡好用,得到答案你的感覺還是這有什麼用?對你現在都在一個main就做完的需求,的確這些工具都沒用
作者: gasbomb (虛空雷神獸)   2022-05-10 00:48:00
程式內容農場少看比較好…連等寬字型都沒有的code沒有看的價值
作者: ssccg (23)   2022-05-12 02:42:00
雖然你好像終於看出@Autowired的用處了,但是其實這只是@Autowired能直接用在field得到的方便,不是IoC/DI的好處以你上面的code來說,其實硬要繼續用無參數ctor也不是不行開setter也行,甚至也可以手動reflection取代@Autowiredspring DI的重點是根本不用自己寫那段「組裝」的程式碼,只要依照spring的慣例定義好相依關係,啟動context就會自動組好,組裝方式可以用field/setter/ctor都支援,@Autowired不過是標示而已,有參數的ctor也不是問題(題外話,如果只有一個ctor,不需要@Autowired標示spring也認得,我個人習慣盡可能用這種方式,可以做到immutable,也保證需要自己new的時候不會漏掉依賴,當pojo用也行)然後你說工作上沒碰過複雜的組裝,要不真的是micro service化/AOP用的很成功那沒話說,要不就是Service其實太肥了不是單純CRUD的系統,Service常常會需要多個Service或其他handler、adapter...之類@Component組成的吧

Links booklink

Contact Us: admin [ a t ] ucptt.com