Как работает spring @autowired для классов интерфейса и реализации - PullRequest
0 голосов
/ 16 декабря 2018

Я новичок в Java / Spring Boot и вижу неожиданную функциональность метода, который переопределяется в классе UserServiceImpl.Даже если этот класс не экспортируется, используется переопределенный метод.

По сути, у меня есть класс интерфейса UserService и класс UserServiceImpl для этого интерфейса.В интерфейсе UserService объявлен метод createUser.Затем UserServiceImpl переопределяет этот метод и добавляет дополнительные функциональные возможности.

Затем класс UserController импортирует класс интерфейса UserService и вызывает метод createUser.Однако даже если UserServiceImpl не импортируется в класс UserController, используется переопределенный метод createUser из этого класса.Как для UserController узнать, что метод createUser из интерфейса был переопределен, если класс impl, в котором он переопределен, не импортирован в UserController?

Я включил эти классы ниже:

Интерфейс UserService:

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

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

Impl UserService, где переопределен метод createUser:

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 голосов
/ 16 декабря 2018

Если существует только одна реализация интерфейса, которая аннотирована с помощью @Component или @service с включенным сканированием компонентов Spring, Spring Framework может найти пару (интерфейс, реализация).

@ Qualifier

Если у вас более одной реализации, вам понадобится аннотация @Qualifier для внедрения правильной реализации вместе с аннотацией @Autowired.

0 голосов
/ 16 декабря 2018

Spring ищет реализацию UserService в контексте и находит только один UserServiceImpl, если у вас 2, у вас будет проблема, которая может быть исправлена ​​с помощью профилей или Qualifier

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...