spring @autowired如何为接口和实现类工作

时间:2018-12-16 04:41:40

标签: java spring-mvc spring-boot interface spring-data-jpa

我是Java / Spring Boot的新手,正在看到UserServiceImpl类中重写的方法的意外功能。即使未导出此类,但覆盖的方法仍在使用。

基本上,我有一个UserService接口类和该接口的UserServiceImpl类。 UserService接口具有声明的createUser方法。然后,UserServiceImpl覆盖此方法并添加其他功能。

然后,UserController类导入UserService接口类,并调用createUser方法。但是,即使没有将UserServiceImpl导入到UserController类中,也会使用从此类重写的createUser方法。如果未将覆盖其的impl类导入到UserController中,则UserController如何知道接口中的createUser方法已被覆盖?

我在下面列出了这些课程:

UserService接口:

package sbootproject.service.intrf;
import sbootproject.shared.dto.UserDto;

public interface UserService {
    UserDto createUser(UserDto user);
} 

覆盖了createUser方法的UserService Impl:

package sbootproject.service.impl;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import sbootproject.UserRepository;
import sbootproject.entity.UserEntity;
import sbootproject.service.intrf.UserService;
import sbootproject.shared.dto.UserDto;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserRepository userRepository;

    @Override
    public UserDto createUser(UserDto user) {       
        UserEntity userEntity = new UserEntity();
        BeanUtils.copyProperties(user, userEntity);     
        userEntity.setEncryptedPassword("test");
        userEntity.setUserId("testUserId");     
        UserEntity storedUserDetails = userRepository.save(userEntity);     
        UserDto returnValue = new UserDto();
        BeanUtils.copyProperties(storedUserDetails, returnValue);       
        return returnValue;
    }
}

最后是UserController:

package sbootproject.controller;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import sbootproject.model.request.UserDetailsRequestModel;
import sbootproject.model.response.UserRest;
import sbootproject.service.intrf.UserService;
import sbootproject.shared.dto.UserDto;

@RestController   
public class UserController {

    @Autowired
    UserService userService;    

        @PostMapping(path="/postMethod")
        public UserRest createUser(@RequestBody UserDetailsRequestModel userDetails) {  
            UserRest returnValue = new UserRest();          
            UserDto userDto = new UserDto();
            BeanUtils.copyProperties(userDetails, userDto);         
            UserDto createdUser = userService.createUser(userDto);
            BeanUtils.copyProperties(createdUser, returnValue);         
            return returnValue;
        }
}

2 个答案:

答案 0 :(得分:1)

Spring在上下文中搜索UserService的实现,仅找到一个UserServiceImpl,如果您有2个,将遇到一个可以使用配置文件或Qualifier来解决的问题

答案 1 :(得分:1)

如果只有一个接口实现,并且在启用了Spring的组件扫描的情况下使用@Component或@service进行注释,则Spring框架可以找出(接口,实现)对。

  

@Qualifier

如果有多个实现,则需要@Qualifier批注以及@Autowired批注注入正确的实现。