2013-08-30 28 views
10

Pro Frühling 3 Dokument, The IoC container, die @Named Annotation ist ein Standard entspricht der @Component Annotation.@Named Annotation im Frühjahr MVC

Seit @Repository, @Service und @Controller sind alle @Component, habe ich versucht @Named für alle von ihnen in meiner Spring MVC-Anwendung verwendet. Es funktioniert gut. Aber ich fand den Ersatz von @Controller scheint einen Fehler zu haben. In der Controller-Klasse war es ursprünglich

@Controller 
public class MyController{ 
    ... 
} 

Es funktioniert gut. Als ich @Controller-@Named

geändert
@Named 
public class MyController{ 
    ... 
} 

Es fehlgeschlagen mit Fehler:

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

Aber wenn ich @RequestMapping der Klasse hinzugefügt, wie folgt

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

Es wäre wie erwartet.

Für @Repository und @Service kann ich sie einfach durch @Named ohne Problem ersetzen. Aber der Ersatz von @Controller benötigt zusätzliche Arbeit. Was fehlt mir in der Konfiguration?

Antwort

16

@Named funktioniert genauso wie @Component. Die Anmerkungen @Controller, @Service und @Repository sind jedoch spezifischer.

Vom Frühling 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 Abschnitt erklärt den Unterschied mit @Named.

Viele Komponenten, wie Spring DispatcherServlet (MVC-Konfiguration in WebApplicationContext) suchen nicht nach Component, sie suchen @Controller. Wenn es Ihre Klasse durchsucht, wird es in @Named nicht gefunden. Auf ähnliche Weise sucht das Transaktionsmanagement mit @Transactional nach @Service und @Repository, nicht nach dem generischen @Component.

+0

Bedeutet es, ich sicher 'verwenden können @ Named' '@ Component' für die generische Bean-Injektion zu ersetzen, aber ich muss noch '@ Repository', '@ Service' und' @ Controller' in Spring MVC spezifischen Funktionen verwenden? –

+0

@dino Gern geschehen. Überlegen Sie, ob Sie diese Antwort akzeptieren, es sei denn, Sie möchten mit weiteren Details auf weitere Antworten warten. –

3

Alle @Repository, @Service und @Controller sind in erster Linie für die Deklaration von Spring-Beans, abgesehen davon, dass es zusätzliche Informationen gibt über die Art der Bohne wie Controller zum Frühling, dao etc

Verwandte Themen