spring中的三種依賴注入方式
- 變量(filed)注入
@Autowired UserDao userDao;
- 1
- 2
- 構造器注入
final UserDao userDao; @Autowired public UserServiceImpl(UserDao userDao) { this.userDao = userDao; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- set方法注入
private UserDao userDao; @Autowired public void setUserDao (UserDao userDao) { this.userDao = userDao; }
- 1
- 2
- 3
- 4
- 5
- 6
如你所見,變量(filed)注入的方式是如此的簡潔,沒關。但實際上他是有一些問題的,具體問題如下
- 不能有效的指明依賴。相信很多人都遇見過一個bug,依賴注入的對象為null,在啟動依賴容器時遇到這個問題都是配置的依賴注入少了一個注解什么的。這種方式就過於依賴注入容器了,當沒有啟動整個依賴容器時,這個類就不能運轉,在反射時無法提供這個類需要的依賴。
- 依賴注入的核心思想之一就是被容器管理的類不應該依賴被容器管理的依賴,換成白話來說就是如果這個類使用了依賴注入的類,那么這個類擺脫了這幾個依賴必須也能正常運行。然而使用變量注入的方式是不能保證這點的。
而如果是采用構造器注入或者set注入,就可以避免上訴問題。
- 使用set方式時,這是一種選擇注入,可有可無,即使沒有注入這個依賴,那么也不會影響整個類的運行。
- 使用構造器方式時已經顯式注明必須強制注入。通過強制指明依賴注入來保證這個類的運行。
總結
變量方式注入應該盡量避免,使用set方式注入或者構造器注入,這兩種方式的選擇就要看這個類是強制依賴的話就用構造器方式,選擇依賴的話就用set方法注入。