2013-08-30 22 views
10

Per documento Spring 3, The IoC container, l'annotazione @Named è uno standard equivalente all'annotazione @Component.@Nota annotazione in Spring MVC

Dal @Repository, @Service e @Controller sono tutti @Component, ho cercato di utilizzare @Named per tutti loro nella mia applicazione Spring MVC. Funziona bene. Ma ho trovato che la sostituzione di @Controller sembra avere un bug. Nella classe controller, originariamente, era

@Controller 
public class MyController{ 
    ... 
} 

Funziona correttamente. Quando ho cambiato @Controller a @Named

@Named 
public class MyController{ 
    ... 
} 

E 'riuscito con errore:

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

Ma se ho aggiunto @RequestMapping alla classe come segue

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

Sarebbe funzionare come previsto.

Per @Repository e @Service, posso semplicemente sostituirli con @Named senza alcun problema. Ma la sostituzione di @Controller richiede un lavoro extra. C'è qualcosa che mi manca nella configurazione?

risposta

16

@Named funziona come @Component. Tuttavia, le annotazioni @Controller, @Service e @Repository sono più specifiche.

Dalla primavera 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 sezione spiega la differenza con @Named.

Molti componenti, quali (configurazione MVC in WebApplicationContext) DispatcherServlet di primavera non sono alla ricerca di Component, che stanno cercando @Controller. Quindi, quando analizza la tua classe, non la troverà in @Named. Analogamente, la gestione delle transazioni con @Transactional cerca @Service e @Repository, non per il più generico @Component.

+0

significa posso tranquillamente usare '@ Named' per sostituire '@ Component' per l'iniezione di bean generico, ma ho ancora bisogno di usare' @ Repository', '@ Service', e' @ Controller' nelle funzionalità specifiche di MVC di Spring? –

+0

@dino Prego. Considera di accettare questa risposta a meno che tu non voglia aspettare altre risposte con altri dettagli. –

3

Tutti @Repository, @Service e @Controller sono principalmente per dichiarare bean Spring, a parte che fornisce informazioni supplementari alla primavera circa il tipo di fagiolo come controllore, dao ecc

Problemi correlati