Spring mvc 请帮助解释一个奇怪的龙目舞组合';s@AllArgsConstructor和spring';s@RestController

Spring mvc 请帮助解释一个奇怪的龙目舞组合';s@AllArgsConstructor和spring';s@RestController,spring-mvc,lombok,Spring Mvc,Lombok,我正在做一个客户提供的spring项目 下面是控制器的代码 @Log4j2 @RestController @AllArgsConstructor @RequestMapping(path = "/api/theapi") @Api(value = "Description for the API") public class TheAPIController { private final ModelMapper modelMapper; private final ObjectMapper

我正在做一个客户提供的spring项目

下面是控制器的代码

@Log4j2
@RestController
@AllArgsConstructor
@RequestMapping(path = "/api/theapi")
@Api(value = "Description for the API")
public class TheAPIController {
private final ModelMapper modelMapper;
private final ObjectMapper objectMapper;
private final TheDemoService demoService;
...other code for controller
}
以下是服务代码:

@Service
public class TheDemoService{ ... }
我对两件事感到非常惊讶:

问题1:为什么我们需要使用Lombok项目的@AllArgsConstructor

根据我的理解,Spring提供@RestController,Spring运行时容器将初始化控制器的实例。因此,为我们的控制器设置构造函数似乎是使用Spring控制反转的无效方法,这是正确的吗

问题2。由于使用了@AllArgsConstructor,不知何故,demoService的实例将被注入

但是,我再次感到惊讶,因为Controller的代码没有@Autowired与demoService结合

在实际代码中,“私有最终TheDemoService demoService”没有@Autowired

因此,我可以想到一种可能性,因为Lombok的@AllArgsConstructor将通过

管理员,我无法解释这个逻辑

  • 这是无效的方法,不需要为RestController定义构造函数

  • 这是服务

  • 如果一个配置为Springbean的类只有一个构造函数,那么可以省略自动连线注释,Spring将使用该构造函数并注入所有必要的依赖项


    总之,
    @allargsconstuctor
    可以/应该删除

    感谢您的反馈。如果我们删除了@AllArgsConstructor,那么我们应该使用@Autowire来注入我们的服务,对吗?顺便问一下,你能提供更多关于“这是无效的方法”的理由吗。从我的角度来看,我同意这是无效的,只是想有更具体的技术作品。谢谢。@datt1。您不需要添加自动连线,但您可以,使自动连线明显2。spring将处理bean的创建,因此不需要允许在spring之外创建RestController实例。我只想添加一个更新,为后面的读者提供更多信息。按照我问题中的代码,如果我们删除注释@AllArgsConstructor。我们还必须删除“final”。例如:私人最终模型映射器模型映射器;成为-->专用模型映射器模型映射器;@user7294900抱歉这么晚才回复,我最近几周没有空闲时间。这是我的最新消息。我试图删除@allargsconstuctor,也删除了“final”,即bean注入是这样的,例如:private TheDemoService demoService;现在,spring项目能够运行而没有任何错误,即:mvn spring boot:run,但是当我向这个控制器发送请求(即HTTP GET)时,我得到了NullPointerException,因为demoService为Null。然后,我插入了Autowire,如:@Autowire private TheDemoService demoService;它很好用。我认为,如果我们删除@AllArgsConstructor,我们必须将@Autowire与bean注入一起使用,这样它才能工作。