作者aynmeow (我想成為安康魚)
看板java
標題Re: [問題]沒有autowired會要自己new一堆很深的建構?
時間Thu May 12 20:19:56 2022
從個偷懶者的角度來解釋看看
一開始class A 裡面有N個method
call了一堆class B 每次都要new
太麻煩了吧 而且還消耗new物件的效能
聰明如我就決定用field來存B
所以就
class A{
B b = new B();
}
有夠方便 這下次我一new好A, B就乖乖地躺著給我用了 灑花~
也不用重複new 浪費效能 (當然A跟B在這裡都是無狀態)
但是某天不幸
B也要用A (或是B 在field new出來的class裡面也有new A())
所以我寫了:
class B{
A a = new A();
}
然後...我的程式就炸了 Exception in thread "main" java.lang.StackOverflowError
QQ
當程式碼很龐大的時候
難以避免的 類別間會互相引用, 這就是個問題
如何省去new物件跟初始化的效能, 依賴介面方便抽換的好處
或是 給框架管理能夠做proxy等等優點
就讓目前@Autowired成為熱門解
大概這樣ㄅ
※ 引述《ntpuisbest (阿龍)》之銘言:
: 之前問過類似的問題
: 大概知道了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版
: 這幾天又一直瘋狂糾結這件事....
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.40.184.151 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1652358009.A.137.html
1F:推 ntpuisbest: 謝謝哦 05/13 11:17