Senior
@Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) class MyService { public String getMessage() { return "Сәлем, MyService-тен! Үлгі: " + this.hashCode(); } } @RestController public class MyRestController { @Autowired private MyService myService; @GetMapping("/api/hello") public String hello() { return myService.getMessage(); } } curl [сілтеме] Сәлем, MyService-тен! Үлгі: 56149 curl [сілтеме] Сәлем, MyService-тен! Үлгі: ???????
sobes.tech AI
AI-дан жауап
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) аннотациясы Spring-ке әр сұрау кезінде жаңа MyService мысалын құруды көрсетеді. Алайда, сіздің MyRestController контроллерінде MyService бині @Autowired арқылы өріс арқылы енгізілген — бұл контроллердің құрылу кезінде бір рет орындалады (әдетте singleton ретінде). Нәтижесінде, прототиптік скопқа қарамастан, контроллерде әрқашан бірдей 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 мысалы құрылады.