@ Named Аннотация В Spring MVC


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

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

@Controller
public class MyController{
    ...
}

Это прекрасно работает. Когда я изменил @Controller на @Named

@Named
public class MyController{
    ...
}

Это не удалось с ошибка:

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

Но если я добавлю @RequestMapping к классу следующим образом

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

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

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

2 13

2 ответа:

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

Из родника docs :

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

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

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

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

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