Spring MVC中的@Named注释

时间:2013-08-30 20:06:56

标签: java spring-mvc annotations jsr330

Per Spring 3文档The IoC container@Named注释是与@Component注释等效的标准。

由于@Repository@Service@Controller都是@Component,我尝试在我的Spring MVC应用程序中使用@Named。它工作正常。但我发现替换@Controller似乎有一个错误。在控制器类中,最初是

@Controller
public class MyController{
    ...
}

工作正常。当我将@Controller更改为@Named

@Named
public class MyController{
    ...
}

失败了,错误:

  

“找不到带URI的HTTP请求的映射......”。

但如果我将@RequestMapping添加到课程中,请按以下方式

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

它可以按预期工作。

对于@Repository@Service,我只需将其替换为@Named即可。但是@Controller的替换需要额外的工作。我在配置中缺少什么?

2 个答案:

答案 0 :(得分:19)

@Named@Component的作用相同。但是,注释@Controller@Service@Repository更具体。

从春天docs

  

@Component是任何Spring管理组件的通用构造型。   @Repository@Service@Controller是其中的特化   @Component用于更具体的用例,例如,在   分别是持久性,服务和表示层。

     

例如,这些刻板印象注释成为理想的目标   切入点。也可能是@Repository@Service和。{1}}   @Controller可能会在以后的版本中带有额外的语义   Spring框架。因此,如果您在使用@Component之间进行选择   或@Service为您的服务层,@Service显然更好   选择。同样,如上所述,已经支持@Repository   作为持久性中自动异常转换的标记   层

This部分解释了与@Named的区别。

许多组件,例如Spring的DispatcherServletWebApplicationContext中的MVC配置)都没有找Component,他们正在寻找@Controller。因此,当它扫描您的课程时,它将无法在@Named中找到它。以类似的方式,使用@Transactional的事务管理会查找@Service@Repository,而不是更通用的@Component

答案 1 :(得分:4)

所有@Repository@Service@Controller主要用于声明Spring bean,除了它为Spring提供有关bean类型的额外信息,如controller,dao等