Sobes.tech
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 мысалы құрылады.