[英]I'm new to Spring, can someone explain the beauty of this @Autowired?
我是 Spring 框架的新手,請嘗試理解我的示例代碼中的 @Autowired 鍵。 我有一個從 CrudRepository 擴展的用戶界面。 用戶是我的用戶實例的 class。
public interface UserRepository extends CrudRepository<User, Integer> {
}
現在在我的 Junit 測試 class 我有一些代碼:
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
@Rollback(false)
public class UserRepositoryTests {
@Autowired
private UserRepository repo;
@Autowired
private TestEntityManager entityManager;
@Test
public void testCreatNewUserWithOneRole() {
Role roleAdmin = entityManager.find(Role.class, 1);
User userNamHM = new User("nam@codejava.net", "nam2020", "Nam", "Ha Minh");
userNamHM.addRole(roleAdmin);
User savedUser = repo.save(userNamHM);
assertThat(savedUser.getId()).isGreaterThan(0);
}
我真的很想了解@Autowired 在這里的表現以及后端發生了什么。 UserRepository 只是一個包含一些抽象方法的接口嗎? 為什么我們可以做private UserRepository repo;
? 我們是否只是創建了一個接口的 object ???
非常感謝伙計們!
public interface UserRepository extends CrudRepository<User, Integer> {
}
首先,您定義的接口將生成一個基本的 CRUD(創建、讀取、更新、刪除)存儲庫實現,並在啟動時具有基本的 crud 功能。 這可以通過新的接口方法和注釋( Spring Data Repositories )進行擴展。 此生成的實現作為源代碼不可見,但您可以確定它在運行時存在。 您定義的 CRUD 存儲庫的此實現生成為 Spring 組件,這基本上意味着 Spring 框架將創建此實現 class 的實例並管理此實例。
Spring 使用控制反轉原理(也稱為依賴注入)作為 spring 框架的絕對核心技術。 Spring 依賴注入通過這種依賴注入 Spring 將自動將字段的值設置為由 spring 管理的相關托管組件或方法,這些組件由 @Autowired 注釋進行注釋。 您可以訪問任何類型的組件並將其綁定到相關字段或參數。 在您的代碼中,您有以下源代碼:
@Autowired
private UserRepository repo;
這意味着,在 class Spring 的實例化期間,將為字段repo
創建一個代理設置器,並分配 UserRepository 類型組件的現有托管實例。 此依賴注入僅可用於托管 bean。 在您的情況下,您有帶有注釋UserRepositoryTests
注釋的@DataJpaTest
,它基本上是一個組件,它將啟動 spring 數據 ZF0B4A299C451714903AE3215D69D9 測試。 這就是@Autowired
注釋背后的魔力。 您也可以將其用於方法或構造函數。
您可能有多個 class 實例作為組件。 在這種情況下,您必須通過如下限定符注釋 select 正確的 bean 實例,
@Qualifier("fooBean")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.