2015-08-03 3 views
0

Меня спрашивает коллега о том, чтобы переместить наших сеттеров в конструкторы в нашей весенней фасоли, поскольку «сеттер предоставляет частную переменную, которая может быть потенциально изменена после этапа строительства весной».Предотвращение вызова сеттера дважды в фасоли весны?

Хотя я могу оценить настроение, я не уверен, что это лучший подход? По этой причине мне интересно, существуют ли способы в компоненте Spring для предотвращения вызова сеттера дважды или есть ли у нас проверка, чтобы убедиться, что мы до фазы постконструкции?

Мое беспокойство - конструктор использует индексы, а не именованные свойства. С точки зрения обслуживания кода это не очень дружелюбно.

+0

_I не уверен, что это лучший подход. Почему бы и нет? –

+2

Если вы не хотите, чтобы bean был изменен, то почему вы держите эти сеттеры? – Tom

+1

Если переменная должна быть установлена ​​и никогда не изменяться, лучший способ - пометить ее как «final» и установить ее значение в конструкторе. – dotvav

ответ

1

Весна поддерживает ввод значения поля через отражение при использовании @Autowired или @Inject на частном поле. Таким образом, вы не открываете сеттер и не используете конструктор для инъекции зависимостей.

Если вы хотите, чтобы сеттер присутствовал, вы могли бы рассмотреть возможность определения собственной аннотации, определения pointcut и создания аспект, который предотвращает выполнение метода, если метод был вызван на объект хотя бы один раз.

Лично я предпочитаю, чтобы эти поля заполнялись через конструктор и помечены как окончательные. Количество котельной плиты, генерируемой этим, может иногда быть непомерно высоким, если думать о читаемости кода. Чтобы повысить читаемость, вы можете использовать аннотации @Qualifier или @Named, чтобы дополнительно указать, какой объект должен удовлетворять зависимости при наличии нескольких возможностей.