当前位置: 首页 > 知识库问答 >
问题:

在服务层中对存储库使用“自动连线”注释和“私有最终”注释有什么区别?

姬自强
2023-03-14

我看过一些教程,它们使用不同的语法来完成相同的任务。一旦通过控制器收到创建学生对象的POST请求,服务层就会使用这两种方法注入存储库。

方法1:

@Service
@AllArgsConstructor
@Transactional
public class StudentService {
    private final StudentRepository studentRepo;
    // complete service code using studentRepo
}

以及方法2:

@Service
public class StudentService {
    @Autowire
    private StudentRepository studentRepo;
    // complete service code using studentRepo
}

我读到它与构造函数和字段注入有关,但我真的不明白这种语法是如何解决这种差异的。有什么解释或资源让我更好地理解吗?提前谢谢你!

共有2个答案

松思源
2023-03-14

依赖注入可以以不同的方式实现。你说的可能不太清楚的两种方式是:

  1. 现场注入:
@Service
public class StudentService {
  @Autowired
  private StudentRepository studentRepo;
   // complete service code using studentRepo
}
@Service
//@AllArgsConstructor <-- commenting this for now. Probably your source of confusion
@Transactional
public class StudentService {
    private final StudentRepository studentRepo;

     // For Spring Boot 1.4 and above, using @Autowired on constructor is optional
     // Dependency being injected through constructor
    public StudentService(StudentRepository studentRepo) {
             this.studentRepo = studentRepo;
    }
     // complete service code using studentRepo
}

现在,如果您将@allargsconstuctor(来自ProjectLombok的注释)放入.class文件中,将为您生成构造函数,并生成所需的DI。

范峰
2023-03-14

您正在堆叠大量的框架,这增加了混乱。这种混乱可能是因为您使用的是龙目。@allargsconstuctor自动添加一个构造函数,其中包含构造服务实例所需的所有参数。

@allargsconstuctor为类中的每个字段生成一个包含1个参数的构造函数。标有@NonNull的字段会导致对这些参数进行空检查。-资料来源:Lombok文件

使用@allargsconstuctor有效地生成以下类

@Service
@Transactional
public class StudentService {

    private final StudentRepository studentRepo;

    public StudentService(StudentRepository studentRepo) {
        this.studentRepo=studentRepo;
    }
    // complete service code using studentRepo
}

现在,由于这个类只有一个构造函数,Spring将使用它来进行依赖注入。这被称为基于构造函数的依赖项注入。

@Service
@Transactional
public class StudentService {
    @Autowire
    private StudentRepository studentRepo;
    // complete service code using studentRepo
}

而这称为基于字段的依赖项注入。

IMHO您应该更喜欢基于构造函数的依赖项注入,原因很简单,它非常容易使用,而且非常适合您。您可以轻松地测试它,而使用字段注入编写单元测试是很困难的(er),因为您需要反射来注入字段。

另请参见Java中的依赖项注入,以更全面地解释不同的依赖项注入样式。

 类似资料: