Аннотированный Spring @ Controller также как компонент?

#java #spring #spring-mvc #controller

#java #spring #spring-mvc #контроллер

Вопрос:

Может ли аннотированный контроллер Spring MVC также быть аннотирован аннотациями типа @Component / @ Service и использоваться как контроллер, так и как компонент?

Ответ №1:

Редактировать: уделять больше внимания аспекту разработки программного обеспечения и обновлять ссылку API на SpringV3

Как упоминалось в других ответах, это не идеальный подход к Spring MVC, но, тем не менее, контроллер уже будет доступен для автозапуска в вашем ApplicationContext.

Это уже компонент в вашем ApplicationContext, поэтому вы можете автоматически настроить его по типу. Нет необходимости добавлять аннотацию @Component .

Из документов Spring API: «Эта аннотация служит специализацией @Component, позволяя автоматически определять классы реализации посредством сканирования пути к классам».

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/stereotype/Controller.html

То же самое справедливо и для @Service.

Хотя я сделал это сам, обычно я бы не рекомендовал такой подход к проектированию.

Если возможно, реорганизуйте требуемую функциональность в отдельный компонент, который затем может быть (автоматически) подключен как к @Controller, так и к любому другому компоненту, по мере необходимости.

Если, как вы прокомментировали, вы «загнаны в угол» этим решением (как и я, предыдущими вариантами дизайна), то да будет так.

HTH

Комментарии:

1. Не все, что возможно, также желательно. Использование веб-контроллера в качестве зависимости — ужасный недостаток дизайна

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

3. (вопрос был «может» это, а не «должен» это)

4. Хорошо, достаточно справедливо. Отредактируйте свой ответ, и я удалю отрицательный отзыв (я не могу, если вы его не отредактируете). Подсказка: как насчет изменения ссылки 2.5.6 javadoc на текущую

5. Спасибо за ваши комментарии. Я знаю, что это не лучшее решение, но, как я прокомментировал в ответе Патрика, я просто хочу предоставить то, что уже предоставлено через другой механизм (DWR), и для этого потребуется вручную написать делегат без какой-либо логики вообще. С другой стороны, я знаю, что контроллер каким-то образом оказывается внутри контейнера Spring, хотя в аннотации @Controller нет способа указать name…so Я думаю, это должно быть автоматически подключено по типу, который в порядке, просто не пробовал.

Ответ №2:

Это может, но не должно. Веб-контроллер должен быть точкой входа, ничем другим.

Любая повторно используемая логика, которую он выполняет, должна находиться на выделенном уровне обслуживания, а не в самом контроллере

Комментарии:

1. Спасибо. Обычно я бы так и сделал, но я просто хочу предоставить один и тот же сервис как DWR-сервис и как Rest-сервис. Я мог бы написать контроллер, который затем взаимодействовал бы со службой, но у него не будет логики. Это будет просто удаление из службы; не большой поклонник ручного написания делегатов или прокси.

2. @pakman Хорошо, как насчет помещения методов контроллера в абстрактный класс и создания двух экземпляров

Ответ №3:

Нет, похоже, что он делает слишком много. Один или другой, а не оба. Я не знаю, возможно ли это (я сомневаюсь в этом), но я уверен, что это не рекомендуется.

Комментарии:

1. это возможно, но 1 за рекомендацию против этого

Ответ №4:

Я думаю, что вам следует больше узнать о таких шаблонах, как Front Controller, MVC, DAO и многоуровневой архитектуре и так далее.