在使用spring框架中的依賴注入註解@Autowired時,idea報了一個警告
大部分被警告的代碼都是不嚴謹的地方,因此我深刻了解了一下。
被警告的代碼以下:java
@Autowired
UserDao userDao;
警告內容是spring
Field injection is not recommended
意思就是使用變量依賴注入的方式是不被推薦的。
使用idea解決策略是這樣的:框架
Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies
意思就是老是使用構造器的方式強制注入。ide
依賴注入有三種方式:this
變量(filed)注入
構造器注入
set方法注入
先各自看一下實現方式
變量(filed)注入idea
@Autowired
UserDao userDao;
構造器注入spa
final UserDao userDao; @Autowired public UserServiceImpl(UserDao userDao) { this.userDao = userDao; }
set方法注入code
private UserDao userDao; @Autowired public void setUserDao (UserDao userDao) { this.userDao = userDao; }
相比較而言:對象
優勢:變量方式注入很是簡潔,沒有任何多餘代碼,很是有效的提升了java的簡潔性。即便再多幾個依賴同樣能解決掉這個問題。blog
缺點:不能有效的指明依賴。相信不少人都碰見過一個bug,依賴注入的對象爲null,在啓動依賴容器時遇到這個問題都是配置的依賴注入少了一個註解什麼的,
然而這種方式就過於依賴注入容器了,當沒有啓動整個依賴容器時,這個類就不能運轉,在反射時沒法提供這個類須要的依賴。
在使用set方式時,這是一種選擇注入,無關緊要,即便沒有注入這個依賴,那麼也不會影響整個類的運行。
在使用構造器方式時已經顯式註明必須強制注入。經過強制指明依賴注入來保證這個類的運行。
另外一個方面:
依賴注入的核心思想之一就是被容器管理的類不該該依賴被容器管理的依賴,換成白話來講就是若是這個類使用了依賴注入的類,
那麼這個類擺脫了這幾個依賴必須也能正常運行。然而使用變量注入的方式是不能保證這點的。
既然使用了依賴注入方式,那麼就代表這個類再也不對這些依賴負責,這些都由容器管理,那麼如何清楚的知道這個類須要哪些依賴呢?它就要使用set方法方式注入或者構造器注入。
總結下: 變量方式注入應該儘可能避免,使用set方式注入或者構造器注入,這兩種方式的選擇就要看這個類是強制依賴的話就用構造器方式,選擇依賴的話就用set方法注入。