2013-08-30 13 views
10

Dokument Per Spring 3, The IoC container, Adnotacja @Named jest standardowym odpowiednikiem adnotacji .@Nazwa adnotacyjna w Spring MVC

Od @Repository, @Service i @Controller są wszystkie @Component, starałem się stosować @Named dla wszystkich z nich w mojej aplikacji MVC wiosny. To działa dobrze. Ale znalazłem zastąpienie @Controller wydaje się mieć błąd. W klasie kontrolera oryginalnie było to

@Controller 
public class MyController{ 
    ... 
} 

Działa dobrze. Kiedy zmienił @Controller do @Named

@Named 
public class MyController{ 
    ... 
} 

To nie powiodło się z powodu błędu:

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

Ale jeśli dodałem @RequestMapping do klasy jak postępować

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

będzie działać zgodnie z oczekiwaniami.

Dla @Repository i @Service, mogę po prostu zastąpić je @Named bez problemu. Ale wymiana @Controller wymaga dodatkowej pracy. Czy jest coś czego brakuje w konfiguracji?

Odpowiedz

16

działa tak samo, jak @Component. Adnotacje są jednak bardziej szczegółowe.

Od wiosny 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 sekcja wyjaśnia różnicę @Named.

Wiele komponentów, takich jak (konfiguracji MVC w WebApplicationContext) Wiosna za DispatcherServlet są nie szuka Component, czego szukasz @Controller. Więc kiedy skanuje twoją klasę, nie znajdzie jej w @Named. W podobny sposób zarządzanie transakcjami z @Transactional wygląda na @Service i @Repository, a nie dla bardziej ogólnych @Component.

+0

Czy to znaczy, mogę bezpiecznie korzystać z '@ Named' zastąpić '@ Component' dla generycznego wstrzykiwania fasoli, ale nadal potrzebuję używać' @ Repository', '@ Service' i' @ Controller' w specyficznych funkcjach Spring MVC? –

+0

@dino Nie ma za co. Rozważ zaakceptowanie tej odpowiedzi, chyba że chcesz poczekać na więcej odpowiedzi z innymi szczegółami. –

3

Wszystko @Repository, @Service i @Controller są głównie dla deklarujących fasoli wiosny, oprócz tego, że daje dodatkowe informacje na wiosnę o rodzaju fasoli jak kontroler dao itp