Аноним @Name в Spring MVC

Согласно документу Spring 3, контейнер IoC, @Named аннотация является стандартным эквивалентом @Component аннотаций.

поскольку @Repository, @Service, а также @Controller являются все @ComponentЯ пытался использовать @Named для всех из них в моем приложении Spring MVC. Работает нормально. Но я нашел замену @Controller Кажется, есть ошибка. В классе контроллеров изначально

@Controller
public class MyController{
    ...
}

Работает нормально. Когда я изменился @Controller в @Named

@Named
public class MyController{
    ...
}

Сбой с ошибкой:

Msgstr "Не найдено сопоставление для HTTP-запроса с URI ...".

Но если бы я добавил @RequestMapping в класс, как следует

@Named
@RequestMapping
public class MyController{
     ...
 }

Это будет работать, как ожидалось.

За @Repository а также @ServiceЯ могу просто заменить их @Named без проблем. Но замена @Controller нужна дополнительная работа. Что-то мне не хватает в конфигурации?

2 ответа

Решение

@Named работает так же, как @Component, Тем не менее, аннотации @Controller, @Service, а также @Repository более конкретны.

Из весенней документации:

@Component является общим стереотипом для любого компонента, управляемого Spring. @Repository, @Service, а также @Controller специализации @Component для более конкретных случаев использования, например, на уровнях постоянства, обслуживания и представления соответственно.

Например, эти аннотации стереотипов делают идеальные цели для pointcut. Также возможно, что @Repository, @Service, а также @Controller может содержать дополнительную семантику в будущих выпусках Spring Framework. Таким образом, если вы выбираете между использованием @Component или же @Service для вашего уровня обслуживания, @Service это явно лучший выбор. Точно так же, как указано выше, @Repository уже поддерживается в качестве маркера для автоматического преобразования исключений в вашем слое постоянства.

Этот раздел объясняет разницу с @Named,

Многие компоненты, такие как Spring DispatcherServlet (Конфигурация MVC в WebApplicationContext) не ищем Componentони ищут @Controller, Поэтому, когда он сканирует ваш класс, он не найдет его в @Named, Аналогичным образом управление транзакциями с @Transactional ищет @Service а также @Repositoryне для более общего @Component,

Все @Repository, @Service а также @Controller в основном предназначены для объявления компонентов Spring, кроме того, что он дает дополнительную информацию Spring о типе компонентов, таких как контроллер, дао и т. д.

Другие вопросы по тегам