@Named
works the same as @Component
. However, the annotations @Controller
, @Service
, and @Repository
are more specific.
From the Spring 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 section explains the difference with @Named
.
Many components, like Spring's DispatcherServlet
(MVC configuration in WebApplicationContext
) aren't looking for Component
, they are looking for @Controller
. So when it scans your class, it won't find it in @Named
. In a similar fashion, transaction management with @Transactional
looks for @Service
and @Repository
, not for the more generic @Component
.