Spring MVC中的@Named注释

Din*_* Tw 15 java annotations spring-mvc jsr330

Per Spring 3文档,IoC容器,@Named注释是与注释等效的标准@Component.

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

@Controller
public class MyController{
    ...
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.当我改变@Controller@Named

@Named
public class MyController{
    ...
}
Run Code Online (Sandbox Code Playgroud)

它失败了,错误:

"找不到带URI的HTTP请求的映射......".

但如果我@RequestMapping按照以下方式加入课堂

@Named
@RequestMapping
public class MyController{
     ...
 }
Run Code Online (Sandbox Code Playgroud)

它会按预期工作.

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

Sot*_*lis 20

@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.