Аноним @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 о типе компонентов, таких как контроллер, дао и т. д.