@Named аннотация в 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{
    ...
}

Ошибка с ошибкой:

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

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

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

Он работал бы так, как ожидалось.

Для @Repository и @Service я могу просто заменить их на @Named без проблем. Но замена @Controller требует дополнительной работы. Есть ли что-то, что мне не хватает в конфигурации?

Ответ 1

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

Из Spring docs:

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

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

В этом разделе объясняется разница с @Named.

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

Ответ 2

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