Использование инъекции зависимостей не означает, что использование оператора new
автоматически запрещено во всем коде. Для разных требований применяются разные подходы.
Веб-приложение весной состоит из нескольких взаимодействующих компонентов, которые создаются каркасом и (кроме случаев переопределения области по умолчанию) являются одноточечными. Это означает, что они не должны сохранять какое-либо состояние, поскольку они распределены между всеми запросами (потоками). Другими словами, если вы autowire объект User (или любой другой атрибут модели), он создается при инициализации контекста приложения, и тот же экземпляр присваивается любому пользовательскому запросу. Это также означает, что если запрос изменяет объект, другие запросы также увидят эту модификацию. Излишне говорить, что это ошибочное поведение в многопоточных приложениях, потому что ваш объект User (или другой атрибут модели) принадлежит запросу, поэтому он должен иметь очень узкую область вызова метода или сеанса.
Вы также можете использовать пружинные элементы с различными областями для вас, но для простого сценария инициализации атрибута модели достаточно оператора new
. См. Следующую документацию, если вы заинтересованы в области бобов: Bean scopes
Так что в вашем случае использования второй метод является абсолютно неправильным. Но вы также можете делегировать создание атрибутов вашей модели весной , если они используются как объекты команд (т. Е. Если вы хотите связать им параметры запроса). Просто добавьте его в подпись метода (с аннотацией модели или без нее).
Таким образом, вы можете написать код выше, как
@RequestMapping(method=RequestMethod.GET)
public String create(@ModelAttribute User user){
return "index";
}
Смотри также: Supported method argument types
Ваше последнее предложение не является правильным. Это не «вне сферы действия». Объект все еще упоминается в объекте 'Model', на который ссылается' model'. В конечном итоге он будет перенесен в атрибуты «HttpServletRequest». Только когда цикл обработки запросов будет выполнен, и контейнер будет восстанавливать (или отбрасывает), 'ServletRequest' и' ServletResponse' будет объектом 'User' быть кандидатом для GC. –
Вы правы. Я изменю свой комментарий. – Jigish
Возможно, вы захотите поговорить об использовании второго метода с компонентом области прототипа. –