@ 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
.