Бин области действия прототипа в контроллере возвращает тот же экземпляр - Spring Boot - PullRequest
0 голосов
/ 07 марта 2019

У меня есть контроллер, который определяется следующим образом:

@RestController
public class DemoController {

    @Autowired
    PrototypeBean proto;

    @Autowired
    SingletonBean single;

    @GetMapping("/test")
    public String test() {
        System.out.println(proto.hashCode() + " "+ single.hashCode());
        System.out.println(proto.getCounter());
        return "Hello World";
    }
}

И я определил bean-прототип, как показано ниже:

@Component
@Scope(value= ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrototypeBean {
    static int i = 0;

    public int getCounter() {
        return ++i;
    }
}

Каждый раз, когда я нажимаю http://localhost:8080/test Я получаю один и тот же экземпляр, и счетчик увеличивается каждый раз. Как мне убедиться, что я получаю новый экземпляр каждый раз? Также я хочу знать, почему я не получаю новый экземпляр, хотя я объявил область действия компонента как Prototype.

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Вы объявили DemoController как @RestController, так что это бин с одноэлементной областью действия.Это означает, что он создается один раз, а PrototypeBean также вводится только один раз.Вот почему в каждом запросе у вас есть один и тот же объект.

Чтобы увидеть, как работает прототип, вам нужно внедрить компонент в другой компонент.Это означает, что, имея два @Component s, оба экземпляра autowiring PrototypeBean, PrototypeBean s будут отличаться в обоих из них.

0 голосов
/ 07 марта 2019

То, чего вы пытаетесь достичь, делается с помощью SCOPE_REQUEST (новый экземпляр для каждого http-запроса).

0 голосов
/ 07 марта 2019

Прежде всего, переменная static связана с классом, а не с экземпляром.Удалите статическую переменную.Также добавьте @Lazy аннотацию.Как то так

@RestController
public class DemoController {

    @Autowired
    @Lazy
    PrototypeBean proto;

    @Autowired
    SingletonBean single;

    @GetMapping("/test")
    public String test() {
        System.out.println(proto.hashCode() + " "+ single.hashCode());
        System.out.println(proto.getCounter());
        return "Hello World";
    }
}
@Component
@Scope(value= ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrototypeBean {
    int i = 0;

    public int getCounter() {
        return ++i;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...