我是 Spring 的新手,有人可以解释一下这个 @Autowired 的美妙之处吗?

I'm new to Spring, can someone explain the beauty of this @Autowired?

我是 Spring 框架的新手,请尝试理解我的示例代码中的 @Autowired 键。 我有一个从 CrudRepository 扩展的用户界面。 User 是我的 User 实例的 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; ?我们刚刚创建了一个接口对象吗???

非常感谢你们!

public interface UserRepository extends CrudRepository<User, Integer> { 
}

首先,您定义的接口将在启动时生成具有基本 CRUD 功能的基本 CRUD(创建、读取、更新、删除)存储库实现。这可以通过新的接口方法和注释 (Spring Data Repositories) 进行扩展。此生成的实现作为源代码不可见,但您可以确定它在运行时存在。您定义的 CRUD 存储库的此实现生成为 Spring 组件,这基本上意味着 Spring 框架将创建此实现的实例 class 并管理此实例。

Spring 使用控制反转原理,也称为依赖注入作为 spring 框架的绝对核心技术。 Spring dependency injection 通过这种依赖注入 Spring 将自动将字段的值设置为由 spring 管理的相关托管组件或方法,这些组件或方法由 @Autowired 注释进行注释。您可以访问任何类型的组件并将其绑定到相关字段或参数。在您的代码中,您有以下源代码:

@Autowired
private UserRepository repo;

这意味着,在 class Spring 的实例化过程中,将为字段 repo 创建代理 setter 并分配组件的现有托管实例类型为 UserRepository。此依赖项注入仅可用于托管 bean。在你的情况下,你有 class UserRepositoryTests 用注释 @DataJpaTest 注释,它基本上是一个组件,它将启动 spring 数据 jpa 测试。这就是 @Autowired 注释背后的魔力。您也可以将其用于方法或构造函数。

您可能有多个 class 实例作为组件。在这种情况下,您必须 select 通过限定符注释正确的 bean 实例,如下所示,

@Qualifier("fooBean")