@miha9

Каждый раз создается новый бин. Почему?

Здравствуйте. Создан котроллер (см. листинг ниже), в нем имеется поле loginProccesor, которое инициализируется при создании контроллера (с помощью DI). Отмечу, что экземпляры бина LoginProccesor имеют область видимости в рамках запроса. Вопрос: почему каждый раз, когда контроллер "ловит" http запрос, внедряется новый экземпляр бина LoginProccesor (судя по хэш-кодам)? Он хоть и имеет область видимости в рамках запроса, но ведь сам контроллер у нас имеет область видимости Singleton... То есть создался один раз контроллер -> один раз вызвался его конструктор -> экземпляр loginProccesor также создался один раз и сразу же внедрился

package com.example.testproject.controllers;
import com.example.testproject.models.LoginProccesor;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class LoginController {

    private final LoginProccesor loginProccesor;

    public LoginController(LoginProccesor loginProccesor) {
        this.loginProccesor = loginProccesor;
    }

    @GetMapping("/")
    public String loginGet() {
        return "login.html";
    }

    @PostMapping("/")
    public String loginPost(
            @RequestParam String username,
            @RequestParam String password,
            Model model) {

        if (loginProccesor.login(username, password)) {
            model.addAttribute("message", "Logged");
            return "redirect:/main";
        } else {
            model.addAttribute("message", "Error!");
            return "login.html";
        }

    }

}
  • Вопрос задан
  • 208 просмотров
Решения вопроса 2
xez
@xez Куратор тега Java
TL Junior Roo
У вас не синглтон.
Аннотация @RequestScope как раз о том, что бин будет создаваться каждый раз новый в рамках запроса.
Это, кстати, не отменяет замечание Сергея о прокси-объекте: при создании контроллера внедряется этот самый прокси-объект, а он уже внутри управляет экземплярами LoginProccesor
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Это не так работает. Фактически внедряется в контроллер не сам бин, а прокси-объект, который в каждом запросе указывает на разный экземпляр LoginProccesor.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы