簡體   English   中英

我是 Spring 的新手,有人能解釋一下這個 @Autowired 的美妙之處嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM