Per Spring 3 document, The IoC container, the @Named
annotation is a standard equivalent to the @Component
annotation.
Since @Repository
, @Service
, and @Controller
are all @Component
, I tried to used @Named
for all of them in my Spring MVC application. It works fine. But I found the replacement of @Controller
seems to have a bug. In the controller class, originally, it was
@Controller
public class MyController{
...
}
It works fine. When I changed @Controller
to @Named
@Named
public class MyController{
...
}
It failed with error:
"No mapping found for HTTP request with URI ...".
But if I added @RequestMapping
to the class as follow
@Named
@RequestMapping
public class MyController{
...
}
It would work as expected.
For @Repository
and @Service
, I can simply replace them with @Named
with no issue. But the replacement of @Controller
needs extra work. Is there anything I am missing in the configuration?
All
@Repository
,@Service
and@Controller
are mainly for declaring Spring beans, apart from that it gives extra information to Spring about the type of bean like controller, dao etc@Named
works the same as@Component
. However, the annotations@Controller
,@Service
, and@Repository
are more specific.From the Spring docs:
This section explains the difference with
@Named
.Many components, like Spring's
DispatcherServlet
(MVC configuration inWebApplicationContext
) aren't looking forComponent
, 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
.