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

Неизменяемые объекты и Spring/Spring MVC: правильный выбор?

Я обычно стараюсь разрабатывать классы как непреложные классы, поэтому у меня есть много преимуществ с точки зрения стресса кодирования.

Но, работая с Spring, я иногда замечаю, что в большинстве случаев структура "обескураживает" этот вид дизайна в пользу классического дизайна JavaBeans: конструктор по умолчанию + getters/seters.

Мне действительно не нравятся объекты, созданные JavaBean, из-за их безумной изменчивости. Поэтому мне интересно, не хватает ли чего-то...

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

Что случилось с этим?

4b9b3361

Ответ 1

Хорошо для привязки данных веб-формы (то есть формы POST) проблема заключается в том, что отражение Java слабовато на конструкторах, поэтому трудно выполнить привязку данных без аннотаций. Давным-давно я размышлял о том, чтобы подать сообщение об ошибке, что привязка данных Springs должна использовать забытый @ConstructorProperties (iirc я искал сам патч но это было довольно сложно и сломало много вещей). Возможно, кто-то должен подать запрос на функцию.

BTW Я говорю о привязке к веб-привязке (а не к инъекции зависимостей), потому что Spring долгое время оказывал большую поддержку DI на основе конструктора (неизменяемым объектам нужна инъекция на основе конструктора). На самом деле я бы сказал, что инъекция на основе конструктора или (фабрики статических методов) становятся предпочтительной практикой по сравнению с традиционными компонентами getter/setter (вы можете видеть это во многих изменениях классов Spring за эти годы, двигаясь к конечным и конструкторам).

В любом случае мне удалось связать привязку веб-данных с неизменяемыми объектами, используя Jackson https://gist.github.com/agentgt/4458079

(Хотя его использование Jackson для привязки запроса не обязательно должно быть в JSON)

Вы также можете увидеть Spring Webflow DataBinding для неизменяемых объектов через конструктор?, где я оригинал придумал суть и имеет больше информации.

Ответ 2

Я иногда создаю отдельные неизменяемые классы "модель дизайна" и изменяемые (Java Bean) классы "MVC model", чтобы избежать таких проблем.

Ответ 3

Он использует Injection Dependency для инъекции объектов в другие объекты. Поэтому, если этот другой объект неизменен, он не может изменить свое состояние.