2013-08-30 3 views
10

Per Spring 3 document, The IoC container, аннотация @Named является стандартом, эквивалентным аннотации @Component.@Named аннотация в Spring MVC

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

@Controller 
public class MyController{ 
    ... 
} 

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

@Named 
public class MyController{ 
    ... 
} 

Он потерпел неудачу с ошибкой:

"No mapping found for HTTP request with URI ...".

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

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

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

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

ответ

16

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

С весны docs:

@Component is a generic stereotype for any Spring-managed component. @Repository , @Service , and @Controller are specializations of @Component for more specific use cases, for example, in the persistence, service, and presentation layers, respectively.

For example, these stereotype annotations make ideal targets for pointcuts. It is also possible that @Repository , @Service , and @Controller may carry additional semantics in future releases of the Spring Framework. Thus, if you are choosing between using @Component or @Service for your service layer, @Service is clearly the better choice. Similarly, as stated above, @Repository is already supported as a marker for automatic exception translation in your persistence layer.

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

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

+0

Означает ли это, что я могу спокойно использовать '@ Named' для замены '@ Component' для общей инъекции bean-компонентов, но мне все еще нужно использовать' @ Repository', '@ Service' и' @ Controller' в специальных функциях Spring MVC? –

+0

@dino Добро пожаловать. Подумайте о принятии этого ответа, если вы не хотите ждать дополнительных ответов с другими подробностями. –

3

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

Смежные вопросы