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
的替换需要额外的工作。我在配置中缺少什么?
答案 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的DispatcherServlet
(WebApplicationContext
中的MVC配置)都没有找Component
,他们正在寻找@Controller
。因此,当它扫描您的课程时,它将无法在@Named
中找到它。以类似的方式,使用@Transactional
的事务管理会查找@Service
和@Repository
,而不是更通用的@Component
。
答案 1 :(得分:4)
所有@Repository
,@Service
和@Controller
主要用于声明Spring bean,除了它为Spring提供有关bean类型的额外信息,如controller,dao等