Назад к вопросам
IT One
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: ???????
Компании, где спрашивали
Ответ от нейросети
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.