Подтвердить что ты не робот

Mutability и Spring

В настоящее время я перечитываю "Эффективную Java" во время работы в магазине, который интенсивно использует Spring Injection Dependency Injection. При чтении книги Блоха нельзя не упомянуть то внимание, которое он уделяет неизменности в классах (он несколько раз утверждает, что классы должны быть как можно более неизменными). Я не могу не чувствовать это в прямом противоречии с тем, что Spring Injection Dependency (и большинство двигателей DI для этого факта) имеет стандарт javabeans. Чтение "Spring в действии" главы на DI кажутся такими, что они сделают блох скрещенными с их изменяемыми классами, состоящими из объектов, созданных вне вашего поля зрения, которые могут быть изменчивы сами по себе.

Неужели идеи Блоха слишком новы для Spring? Вышла ли модель Spring? Ставит ли Блох позицию в отношении неизменности только для написания кода библиотеки? При написании кода Spring следует писать гибкие объекты с большим количеством геттеров и сеттеров или загружать все в конструкторе?

4b9b3361

Ответ 1

Фактически, spring beans неизменяемы по идее, даже если вы не применяете это.

Вы можете предоставить только getter в поле final, которое инициализируется с помощью вставки конструктора.

Обычно вы этого не делаете, но вы никогда не должны переназначать поля beans, которые вводятся каркасом DI. Это потому, что spring beans обычно не содержат какого-либо состояния, кроме их зависимостей (и их область действия является одиночной). Конечно, есть исключения, такие как прототип и область запроса beans, что они редки (например, в двух больших и двух средних проектах я использовал только 1 прототип bean)

Ответ 2

Вы можете сохранять классы неизменными и использовать Injection Dependency, если вы используете инъекцию на основе конструктора. Таким образом, вы можете избежать ненужных настроек.

Ответ 3

Я сам не вижу конфликта, особенно с Spring MVC. С какими beans управляет Spring? В основном ваши контроллеры и ваш сервисный/информационный слой DAO и сервисы. Как правило, у них нет реального состояния и нет сеттеров. Если ваша проблема связана с инъекцией сеттера (например, у вас есть свой собственный класс, который должен управляться с помощью Spring, и вы не хотите, чтобы сеттеры были для определенных полей), тогда вы можете вместо этого использовать инъекцию конструктора (или объединить оба).