Spring Boot делает выбор bean-компонента на основе имени переменной?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Boot делает выбор bean-компонента на основе имени переменной?

Сообщение Anonymous »

Недавно я решил немного поиграть с внедрением Bean-компонента Spring.
Я пытался спровоцировать сбой моего приложения, когда было два определения Bean-компонента одного типа, но приложение начало run.
Я придумал такую ​​схему:
Это мой простой интерфейс

Код: Выделить всё

public interface Demo {

String getMessage();
}
Два класса, реализующих этот интерфейс

Код: Выделить всё

@Service
public class DemoService implements Demo{

private final DataRepo repo;

DemoService(DataRepo repo) {
this.repo = repo;
}

@Override
public String getMessage() {
return "Demo message from Demo Service";
}
}

Код: Выделить всё

@Service
public class DemoSecondService implements Demo{

private final DataRepo repo;

DemoSecondService(DataRepo repo) {
this.repo = repo;
}

@Override
public String getMessage() {
return "Demo message from DemoSecondService";
}
}
Это мой контроллер:

Код: Выделить всё

@RestController
@RequestMapping("/demo")
public class DemoController {

private final Demo demoSecondService; //(1)

public DemoController(Demo demoSecondService) {
this.demoSecondService = demoSecondService;
}

@GetMapping
ResponseEntity hello() {
return new ResponseEntity("Hello", HttpStatus.OK);
}

@GetMapping("/more")
ResponseEntity moreHello() {

String message = demoSecondService.getMessage();
return new ResponseEntity(message, HttpStatus.OK);
}
Итак, я заметил, что, несмотря на наличие двух bean-компонентов типа «Demo», у Spring нет проблем с внедрением bean-компонентов в DemoController, даже если я не использую аннотацию @Qualifier. Если только переменная Demo в контроллере имеет имя «demoSecondService», Spring внедряет Bean DemoSecondService, а если имя переменной — demoService, Spring автоматически внедряет Bean DemoService. Это работает, даже если переменная имеет имя типа demoSecondServiceXXXXX. Когда имя переменной меняется на что-то совершенно отличное от имени класса, например, «newName», то, как и ожидалось, Spring сообщает, что не может выбрать, какой bean-компонент я хотел бы внедрить в свой контроллер:

Код: Выделить всё

Parameter 0 of constructor in com.example.demo.domain.controller.DemoController required a single bean, but 2 were found:
- demoSecondService: defined in file
- demoService: defined in file
Так почему же в ситуации, когда имя переменной совпадает с именем класса, Spring может внедрить конкретный компонент?
Выполняет ли SpringBoot выбор компонента на основе имени переменной, чтобы мы могли использовать его без использования @ Квалификация?

Подробнее здесь: https://stackoverflow.com/questions/786 ... iable-name
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»