→ ssccg: 你只用你自己寫的程式當然覺得都用無參數建構子就好05/09 04:46
→ ssccg: 假設你的Dao需要個一定得從外面傳進來的DataSource05/09 04:47
→ ssccg: 勢必要改成這一串相依類別的建構子都要有DataSource參數05/09 04:48
→ ssccg: 「所有類別都能用無參數建構子new出來」是你一廂情願的想法05/09 04:49
→ ssccg: 就算不用依賴注入,把Dao的new直接寫在Service的裡也不是好05/09 04:52
→ ssccg: 事,這代表Dao的建構子一改你所有new到他的Service都要改05/09 04:52
→ ssccg: 這就是直接依賴實作的問題,即使沒有特別抽出interface,只05/09 04:55
→ ssccg: 呼叫public method是只依賴於介面,呼叫到建構子是綁死實作05/09 04:56
→ ntpuisbest: 晚點來看一下Data source例子,謝謝05/09 08:38
https://i.imgur.com/5Is3GmX.jpg
https://i.imgur.com/IJHRcWy.jpg
不知道你說的是不是這種例子
但看起來用getDatasouce好像也沒有依賴實作的問題
可能我找的例子沒很好
抱歉
※ 編輯: ntpuisbest (36.225.243.102 臺灣), 05/09/2022 20:31:34
→ ssccg: 你在你的Dao裡面是要怎麼呼叫getDatasource? 05/09 21:17
我看他的測試程式碼,並沒有呼叫getDatasource這個方法,但有autowired他
是代表autowired自動會為了注入,所以呼叫getter嗎?
然後@Bean註解也有發揮效用?
※ 編輯: ntpuisbest (49.216.234.222 臺灣), 05/09/2022 22:24:47
https://www.796t.com/content/1549926748.html
我覺得可能跟這有關,不確定他怎麼做掉的
https://i.imgur.com/futmx4a.jpg
https://i.imgur.com/FD36yv2.jpg
※ 編輯: ntpuisbest (49.216.234.222 臺灣), 05/09/2022 23:22:24
→ ssccg: 那個getDatasource不是getter,是定義一個Bean (由spring的05/10 00:22
→ ssccg: ApplicationContext管理的物件),spring的@Autowired或其他05/10 00:23
→ ssccg: 注入方式並不是找任意類別,只會從ApplicationContext中註05/10 00:26
→ ssccg: 冊的Bean裡找名稱/類別/Qualifer符合的05/10 00:27
→ ssccg: 先不談spring怎麼做的,先集中在你一開始的問題,所以你把05/10 00:28
→ ssccg: 你的Service、Dao1、Dao11寫好了,現在Dao11裡面要這個 05/10 00:29
→ ssccg: DataSource,你main裡只有Service1 service=new Service1()05/10 00:31
→ ssccg: 你要怎麼改?05/10 00:31
那這樣就無法是空的建構子了?
但我陷入的僵局是jdbc的連線資訊寫死在
application.properties裡面
如果是一般的物件,比如說是Company裡面有一個member是員工好了
我還可以理解new Employee("name",age)
new Company(new Employee("name",age)
但是對於寫死的,要更改只要更改
applicstion.properties就好
我寫的有點亂
我知道要跟資料庫連線一定要有連線資訊
所以我一定要將連線資訊注入dao
那如果說autowired在datasource上幫我注入了好了
那沒有autowired這個註解,我要怎麼注入?
就我以前學的理解最早應該都是封裝一個類別來get connection
差不多這樣
Connection conn = DBUtils.getConn();
那如果是這樣我好像也不會看到一層層的new
(高耦合)
還有依賴於dao的service如果沒有autowired註解的話
是不是就會有一層層new了呢?
→ ssccg: 是說你問法很像只有在找範例讀、寫些只有sout的測試,建議05/10 00:34
→ ssccg: 先找個題目寫個會動的系統,真正用過這些功能再問05/10 00:35
→ ssccg: 工具是解決問題用的,你沒有問題要解決,拿著工具再怎麼問05/10 00:42
→ ssccg: 它哪裡好用,得到答案你的感覺還是這有什麼用?05/10 00:43
→ ssccg: 對你現在都在一個main就做完的需求,的確這些工具都沒用05/10 00:45
因為我上班一年下來
幾乎都是在application.properties裡面就把database的連線設定寫好,因為我們不會同
時連超過兩個資料庫,雖然還是有分dev跟prod
不過就只是用spring.profiles.active=xxxx而已
平常工作就是寫restful api,複雜一點頂多表格多一點join
只是我這次面試下來發現很多面試官都超愛問我
spring ioc能幹嘛幹嘛
結果當我反問我在版上舉的那些例子的時候
每個人都跟我說降低了耦合
我就會問那我這樣new一個空的建構子到底跟
autowired差在哪?
幾乎每個都垮(當然我面試的工作最高薪頂多70萬而已) 但我還是覺得很扯
只有一個提到搭配介面還有qualifierd註解
各式各樣的文章都強調
ioc跟di是spring的核心價值
但或許是因為我一直在用spring boot
平常也是無腦autowired
dao 到service
service到controller這樣
總之我覺得這應該是很基本的東西
但我工作快一年掌握度還很低
讓我覺得不該是這樣
→ gasbomb: 程式內容農場少看比較好…05/10 00:48
→ gasbomb: 連等寬字型都沒有的code沒有看的價值05/10 00:49
※ 編輯: ntpuisbest (49.216.234.222 臺灣), 05/10/2022 02:11:49
好像大概懂了
我在field裡面新增了word
https://imgur.com/a/dKHqjIw
這樣大概看出autowired的好處了
※ 編輯: ntpuisbest (49.216.234.222 臺灣), 05/10/2022 19:59:32
→ ssccg: 雖然你好像終於看出@Autowired的用處了,但是其實這只是05/12 02:42
→ ssccg: @Autowired能直接用在field得到的方便,不是IoC/DI的好處05/12 02:44
→ ssccg: 以你上面的code來說,其實硬要繼續用無參數ctor也不是不行05/12 02:51
→ ssccg: 開setter也行,甚至也可以手動reflection取代@Autowired05/12 02:53
→ ssccg: spring DI的重點是根本不用自己寫那段「組裝」的程式碼,只05/12 02:54
→ ssccg: 要依照spring的慣例定義好相依關係,啟動context就會自動組05/12 02:55
→ ssccg: 好,組裝方式可以用field/setter/ctor都支援,@Autowired不05/12 02:57
→ ssccg: 過是標示而已,有參數的ctor也不是問題05/12 02:59
→ ssccg: (題外話,如果只有一個ctor,不需要@Autowired標示spring也05/12 03:00
這個我知道喔,只有一個的話不用標
→ ssccg: 認得,我個人習慣盡可能用這種方式,可以做到immutable,也05/12 03:12
→ ssccg: 保證需要自己new的時候不會漏掉依賴,當pojo用也行) 05/12 03:22
→ ssccg: 然後你說工作上沒碰過複雜的組裝,要不真的是micro service 05/12 03:28
→ ssccg: 化/AOP用的很成功那沒話說,要不就是Service其實太肥了05/12 03:30
→ ssccg: 不是單純CRUD的系統,Service常常會需要多個Service或其他05/12 03:39
→ ssccg: handler、adapter...之類@Component組成的吧05/12 03:51
我的service通常裡面也會需要用到其他很多crud service
其實我沒寫過apapter handler
但我有用spring security寫過一個custom login page的系統連過mysql
就我這裡的理解由於service裡面都有用到dao
所以其實autowired註解真正用在dao的效用還比較大?
因為要注入連線資訊到dao裡面
但在controller中應該是可以無參數子的new service()吧,手頭沒電腦不太確定
※ 編輯: ntpuisbest (49.216.80.89 臺灣), 05/13/2022 00:25:37