@ 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 ответа:
@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.