Mapsruct class 和@Service class 没有@Autowired

No @Autowired for Mapsruct class as well as for @Service class

我正在尝试将 MapStruct 用于 DTO 到实体(产品)的映射,反之亦然,方法是参考此 blog

├── product
   ├── Product.java
   ├── ProductAPI.java
   ├── ProductDTO.java
   ├── ProductMapper.java
   ├── ProductRespository.java
   └── ProductService.java

在控制器中,我看不到 productService(@Service) 和 productMapper(@Mapper) 的 @Autowired

import java.util.List;
import java.util.Optional;


import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RequiredArgsConstructor

@RestController
@RequestMapping("/products")
public class ProductAPI {
    private final ProductService productService;
    private final ProductMapper productMapper;

    @GetMapping
    public ResponseEntity<List<ProductDTO>> findAll() {
        return ResponseEntity.ok(productMapper.toProductDTOs(productService.findAll()));
    }

    @PostMapping
    public ResponseEntity<ProductDTO> create(@RequestBody ProductDTO productDTO) {
        productService.save(productMapper.toProduct(productDTO));

        return ResponseEntity.status(HttpStatus.CREATED).body(productDTO);
    }
}

我想知道为什么 MapStruct class(即 prodcutMapper)没有依赖注入。

难道是Mapstruct框架负责在controller层调用自己? @Service 服务层也是如此吗?

Spring 如果 Bean 具有一个构造函数(在您的情况下由 @RequiredArgsConstructor 提供),则允许您省略 @Autowired 注释。

所以简而言之,依赖注入的发生是因为 @Autowired 效果正在发生,并且在这种情况下注释本身被省略了。

查看文档 here

这是错误的。好吧,与其将映射器代码放入控制器,不如将其移至服务,因为控制器不应包含任何此类代码。

这样问题就解决了。 Mapper 可以放在这里但是那会被称为不好的方法。

在服务层,它会像魅力一样工作。只需执行以下操作。

@Mapper(componentModel = "spring")
public interface productMapper {...}

并在服务中 class 进行自动装配

@Autowired
private   productMapper productMapper;

大功告成。