Sobes.tech
Назад к вопросам
Senior
7

@Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) class MyService { public String getMessage() { return "Hello from MyService! Instance: " + this.hashCode(); } } @RestController public class MyRestController { @Autowired private MyService myService; @GetMapping("/api/hello") public String hello() { return myService.getMessage(); } } curl [link] Hello from MyService! Instance: 56149 curl [link] Hello from MyService! Instance: ???????

Компании, где спрашивали
IT OneIT One

Ответ от нейросети

sobes.tech AI

Аннотация @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) указывает, что Spring должен создавать новый экземпляр MyService при каждом запросе бина. Однако в вашем контроллере MyRestController бин MyService внедрён через поле с помощью @Autowired — это происходит один раз при создании контроллера (который по умолчанию синглтон). В итоге, несмотря на прототипный скоуп, в контроллере всегда используется один и тот же экземпляр MyService.

Поэтому при повторных вызовах /api/hello вы будете видеть один и тот же хэшкод экземпляра.

Чтобы получить новый экземпляр MyService при каждом вызове, можно:

  • Внедрять ObjectProvider<MyService> или ApplicationContext и запрашивать бин вручную внутри метода.
  • Использовать @Lookup метод для получения нового экземпляра.

Пример с ObjectProvider:

@RestController
public class MyRestController {

    @Autowired
    private ObjectProvider<MyService> myServiceProvider;

    @GetMapping("/api/hello")
    public String hello() {
        MyService myService = myServiceProvider.getObject();
        return myService.getMessage();
    }
}

Так при каждом вызове hello() будет создаваться новый экземпляр MyService.