20

根据 Spring 3 文档IoC 容器@Named注解是等同于@Component注解的标准。

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

@Controller
public class MyController{
    ...
}

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

@Named
public class MyController{
    ...
}

它失败并出现错误:

“没有为带有 URI ... 的 HTTP 请求找到映射”。

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

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

它会按预期工作。

对于@Repositoryand @Service,我可以简单地将它们替换@Named为没有问题。但更换@Controller需要额外的工作。我在配置中缺少什么吗?

4

2 回答 2

29

@Named@Component. 但是,注释@Controller@Service@Repository更具体。

来自 Spring文档

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

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

节说明与 的区别@Named

许多组件,例如 Spring 的DispatcherServlet(MVC 配置WebApplicationContext)不是在Component寻找@Controller. 因此,当它扫描您的班级时,它不会在@Named. 以类似的方式,事务管理@Transactional寻找@Serviceand @Repository,而不是更通用的@Component.

于 2013-08-30T20:09:40.843 回答
4

All @Repository, @Serviceand@Controller主要用于声明 Spring bean,除此之外,它向 Spring 提供有关 bean 类型的额外信息,如控制器、dao 等

于 2013-11-29T10:30:40.323 回答