服务和服务实现的自动装配 class

Autowiring of Service and Service Implementation class

以下是我的代码

@RestController
public class EmployeeController {

    @Autowired
    EmployeeService empService;

public EmployeeController (EmployeeService Impl empServiceImpl) {
        super();
        this.empService = empServiceImpl;

    }

}

@Service
public interface EmployeeService {

public List<EmployeeDTO> getAllEmployeeDetails()

}

public class EmployeeServiceImpl {

public List<EmployeeDTO> getAllEmployeeDetails(){
  //methods business logic and repo call goes here
}

}

当我启动服务器时出现以下错误。

Parameter 1 of constructor in com.app.in.controller.EmployeeController required a bean of type 'com.app.in.service.EmployeeServiceImpl' that could not be found

我的理解可能有误。如果我也用 @Service 注释 EmployeeSeriveImpl class 那么它 working.Is 这是正确的方法吗?我的问题是服务接口用@Service 注释仍然为什么它的实现也需要注释。如果我错过了什么,请告诉我?解决这个问题的标准方法是什么?

您可以使用构造函数注入您的依赖项。在这种情况下 @Autowired 是可选的。

这是您的示例,但有一些更正:

@RestController
public class EmployeeController {

    // private final is a good practice. no need in @Autowire
    private final EmployeeService empService;

    // this constructor will be used to inject your dependency
    // @Autowired is optional in this case, but you can put it here
    public EmployeeController (EmployeeService empServiceImpl) {
        this.empService = empServiceImpl;

    }

}

我假设您有一个接口 EmployeeService 和 class EmployeeServiceImpl 实现该接口并且是 Spring Bean。

像这样:

@Service
public class EmployeeServiceImpl implements EmployeeService {}

为什么需要这个 @Service?当您将此注释放在 class 上时,Spring 知道这是一个 Spring 应该为您管理的 bean(容器将创建它的实例并将其注入到需要的地方)。

查看 Spring 文档以获取有关 Dependency Injection 的更多详细信息。

Spring团队通常提倡构造函数注入,因为它允许您将应用程序组件实现为不可变对象,并确保所需的依赖项不为空。