请帮助解释Lombok的@AllArgsConstructor和spring的@RestController的奇怪组合

时间:2019-08-21 09:51:18

标签: spring-mvc lombok

我正在从客户那里进行春季项目。

下面是控制器的代码

@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运行时容器将为我们的Controller初始化一个实例。因此,为我们的Controller构造一个构造函数似乎是使用Spring Inversion of Control的一种无效方法,这是正确的吗?

问题2。由于使用@AllArgsConstructor,因此将以某种方式注入demoService的实例

但是,再次让我感到惊讶的是,Controller的代码没有与demoService结合使用@Autowired。

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

因此,我可能会想到一种可能性,因为Lombok的@AllArgsConstructor将通过以下构造函数注入TheDemoService的实例

The APIController,我对此逻辑一无所知。

1 个答案:

答案 0 :(得分:2)

  1. 这是无效的方法,无需为RestController定义构造函数

  2. 这是implicitly auto wiring服务

  

如果配置为Spring bean的类仅具有一个构造函数,则可以省略Autowired批注,Spring将使用该构造函数并注入所有必要的依赖项。

总结@AllArgsConstructor可以/应该删除