1. 程式人生 > >【轉載】Spring MVC @Autowired註入問題

【轉載】Spring MVC @Autowired註入問題

這就是我 參數 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     private
DependencyB 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註入問題