Spring MVC中的@Named注释


问题内容

在Spring 3文档的IoC容器中@Named注释是与注释等效的标准@Component

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

@Controller
public class MyController{
    ...
}

工作正常。当我改变@Controller@Named

@Named
public class MyController{
    ...
}

失败并出现错误:

“未找到带有URI的HTTP请求的映射。”。

但是如果我@RequestMapping按照以下方式添加到班级中

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

它会按预期工作。

对于@Repository@Service,我可以毫无问题地替换它们@Named。但是更换@Controller需要额外的工作。我在配置中缺少什么吗?


问题答案:

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

从Spring 文档中

@Component是任何Spring托管组件的通用构造型。
@Repository@Service@Controller分别是@Component针对特定用例的专门化
,例如分别在持久性,服务和表示层。

例如,这些构造型注释成为切入点的理想目标。这也有可能是@Repository@Service@Controller可以携带Spring
Framework的未来版本中为更多的语义。因此,如果您在使用@Component
还是@Service在服务层之间进行选择,@Service显然是更好的选择。同样,如上所述,@Repository在持久层中已经支持将其作为自动异常转换的标记。

节说明与的区别@Named

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