Spring依賴注入方式(Dependency Injection)
Spring依賴注入(Dependency Injection)
先說結論
- 實際開發(fā)時盡量選擇 構造器注入 而不是 字段注入。
- 設值注入 和 方法注入 適用的場景較少,較特殊。
原因
- 官方推薦使用!
- 代碼更簡潔:配合 Lombok 的 @RequiredArgsConstructor,可以自動生成包含所有 final 字段的構造函數。
- 更安全:構造器注入確保所有必需的依賴在對象創(chuàng)建時就已經注入,避免了在運行時忘記注入某個依賴導致 NullPointerException 的問題。
- 更易于測試:使用構造器注入時,可以直接通過構造器傳遞依賴進行單元測試,而不需要模擬框架的注入機制。
至于 @Resource它是 Java 的 javax.annotation.Resource 注解,個人建議在Spring項目中就不要用了。
兩者區(qū)別如下:
@Autowired
- Spring 提供的注解:@Autowired 是 Spring 容器提供的注解,專門用于依賴注入。
- 默認按類型注入:@Autowired 默認按照類型(type)進行注入。
- 可指定按名稱注入:可以通過 @Qualifier 注解指定按名稱注入。
@Resource
- J2EE 標準注解:@Resource 是 J2EE 標準的一部分,通常用于 EJB 和其他 J2EE 資源的注入。
- 默認按名稱注入:@Resource 默認按照名稱(name)進行注入,如果找不到匹配的名稱,則按類型(type)注入。
- 不需要 @Qualifier:@Resource 可以通過 name 屬性指定名稱,而不需要額外的 @Qualifier 注解。
一、構造器注入(Constructor Injection)
構造器注入通過類的構造方法來傳遞依賴。
舉個例子:
@RestController @RequiredArgsConstructor public class WarningTaskController { // 注意使用 final 標記不可變 private final WarningTaskService taskService; // 多個依賴可以 }
二、設值注入(Setter Injection)
設值注入通過 setter 方法來注入依賴。
舉個例子:
使用 Spring Security ,默認內存用戶認證的信息可以配置spring.security.user.name=customUserName
就是通過 Setter 注入。
源碼如下:
@ConfigurationProperties(prefix = "spring.security") public class SecurityProperties { // 省略一些非必要的代碼 private final User user = new User(); public User getUser() { return this.user; } public static class User { private String name = "user"; private String password = UUID.randomUUID().toString(); private List<String> roles = new ArrayList<>(); private boolean passwordGenerated = true; public String getName() { return this.name; } public void setName(String name) { this.name = name; } // 省略其他 getter/setter } }
三、字段注入(Field Injection)
字段注入直接通過字段來注入依賴。
舉個例子:
@RestController public class WarningTaskController { // 不推薦使用 // 如果依賴非常多,代碼會很臃腫 @Autowired private final WarningTaskService taskService; }
四、方法注入(Method Injection)
方法注入通過方法參數來注入依賴。
舉個例子:
@RestController public class WarningTaskController { private WarningTaskService taskService; // 不推薦 如果對象是可變的 @Autowired public void configure(WarningTaskService taskService) { this.taskService = taskService; } // 其他業(yè)務邏輯... }
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Maven+Tomcat8 實現(xiàn)自動化部署的方法
本篇文章主要介紹了Maven+Tomcat8 實現(xiàn)自動化部署的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10Apache DolphinScheduler實現(xiàn)自動化打包單機/集群部署詳解
這篇文章主要為大家介紹了Apache DolphinScheduler實現(xiàn)自動化打包單機/集群部署詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09InterProcessMutex實現(xiàn)zookeeper分布式鎖原理
本文主要介紹了InterProcessMutex實現(xiàn)zookeeper分布式鎖原理,文中根據實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03java中double轉化為BigDecimal精度缺失的實例
下面小編就為大家?guī)硪黄猨ava中double轉化為BigDecimal精度缺失的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03idea SpringBoot+Gradle環(huán)境配置到項目打包
Gradle是一個基于Java應用的項目自動化構建工具,本文介紹了在IDEA中創(chuàng)建Spring Boot Gradle項目,項目配置包括init.gradle和settings.gradle,感興趣的可以了解一下2024-11-11