【轉載】Spring MVC @Autowired註入問題
阿新 • • 發佈:2018-11-24
這就是我 參數 int .net rec except 方法註入 null https
背景
在IDEA升級2017版後,發現以前使用的 @Autowired 出現了個警告 Field injection is not recommended。
@Autowired的不推薦用法
在一個Bean內,可以使用@Autowired註入另一個Bean。
Field 註入(屬性註入)
1 @Service 2 public class UserService(){ 3 4 } 5 6 @Controller 7 public class UserController(){ 8 9 @Autowired 10 private UserService userService;11 }
事實上,這就是我平常使用的方式,直接在Field上添加註解,簡潔又好看。
但這是不推薦的使用方法。
@Autowired的三種使用方式
通過構造器註入
通過setter方法註入
通過field反射註入
1 public class DI(){ 2 3 // 1.通過構造器註入 4 private DependencyA a; 5 @Autowired 6 public DI(DependencyA a){ 7 this.a = a; 8 } 9 10 // 2.通過setter方法註入 11 privateDependencyB b; 12 @Autowired 13 public void setDependencyB(DependencyB b){ 14 this.b = b; 15 } 16 17 // 3.通過field反射註入 18 @Autowired 19 private DependencyC c; 20 }
弊端
如果你使用的是構造器註入
恭喜你,當你有十幾個甚至更多對象需要註入時,你的構造函數的參數個數可能會長到無法想像。
如果你使用的是field反射註入
如果不使用Spring框架,這個屬性只能通過反射註入,太麻煩了!這根本不符合JavaBean規範。
還有,當你不是用過Spring創建的對象時,還可能引起NullPointerException。
並且,你不能用final修飾這個屬性。
如果你使用的是setter方法註入
那麽你將不能將屬性設置為final。
兩者取其輕
Spring3.0官方文檔建議使用setter註入覆蓋構造器註入。
Spring4.0官方文檔建議使用構造器註入。
結論
如果註入的屬性是必選的屬性,則通過構造器註入。
如果註入的屬性是可選的屬性,則通過setter方法註入。
至於field註入,不建議使用。
原文:https://blog.csdn.net/jeikerxiao/article/details/77161680
【轉載】Spring MVC @Autowired註入問題