我看过一些教程,它们使用不同的语法来完成相同的任务。一旦通过控制器收到创建学生对象的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
}
我读到它与构造函数和字段注入有关,但我真的不明白这种语法是如何解决这种差异的。有什么解释或资源让我更好地理解吗?提前谢谢你!
依赖注入可以以不同的方式实现。你说的可能不太清楚的两种方式是:
@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。
您正在堆叠大量的框架,这增加了混乱。这种混乱可能是因为您使用的是龙目。@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中的依赖项注入,以更全面地解释不同的依赖项注入样式。
以及方法2: 我读到它与构造函数和字段注入有关,但我真的不明白这个语法是如何解决两者之间的区别的。有什么可以让我更好理解的解释或资源吗?提前谢谢!
和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?
问题内容: 我大致了解这种构造的作用:它创建了SomeType EJB,并将对象注入到另一个EJB中。 现在,我有一个以这样的方式开始的类:(尽管我认为只有的相关,我会给出所有类级别的注释) 什么的就做吗?他们可能会从JNDI获取或创建“ name1” …对象,但是将结果放在哪里?我看不到附近有任何电话,但是代码库很大,所以我对此不太确定。 额外的问题:我想这两个注释只是重复默认值? 更新:目前有
本文向大家介绍在 Spring MVC 中使用 WebMvcTest 注释有什么用?相关面试题,主要包含被问及在 Spring MVC 中使用 WebMvcTest 注释有什么用?时的应答技巧和注意事项,需要的朋友参考一下 WebMvcTest** 注释用于 Spring MVC 程序的单元测试,其目标是专注于Spring MVC组件。在上面显示的快照中,我们只想启动 ToTestControll