@Component 和 @Named 都用于同一个 bean 类
Posted
技术标签:
【中文标题】@Component 和 @Named 都用于同一个 bean 类【英文标题】:Both @Component and @Named for the same bean class 【发布时间】:2012-04-28 16:36:56 【问题描述】:在 Spring 应用程序中充当 bean 的类是否同时需要 @Component
和 @Named
?
如果两者都这样使用有什么意义?
我尝试在网上搜索并查看了这些注释的标准文档,发现它们有点混乱。
如果@Named
注解没有为 bean 指定任何名称,那么最终应用程序会采用哪个名称?
【问题讨论】:
【参考方案1】:@Component
和 @Named
是基本上做同样事情的注解,但来自不同的 API。
@Component
属于 Spring API。它将类标记为自动检测为 bean,并可选择允许您为该 bean 指定名称 (@Component("foo")
)。如果没有明确的名称规范,检测到的 bean 将获得一个从其类的名称派生的默认名称。
@Named
属于javax.inject
API。它将类标记为自动检测为 bean,并要求您指定名称。
Spring 支持这两种 API。在同一个类中使用两个注解没有意义,因为它们提供相同的功能。
另请参阅:
3.10 Classpath scanning and managed components【讨论】:
【参考方案2】:Spring 支持 @Named
注释 (JSR-330) 作为 @Component
(Spring) 的替代方案。
一般来说,@Named
的名字很糟糕,因为它没有描述它的作用,所以我宁愿尽可能使用@Component
。
【讨论】:
同意,(a)命名不好。但是,许多类是来自不同框架的项目之间的共享资源。使用 @Named 对类进行 bean-ify 需要 javax.injection 作为每个应用程序的依赖项,这比依赖 Spring 进行注解的另一个框架要好得多..【参考方案3】:应该使用两者中的任何一个。 同时使用@Component 和@Named 没有任何意义。 添加到上面(其他的)注释 @Component("[someComponentID]") 和 @Named("[someNamedID]") 以通过在括号中传递 ID 为 bean 分配一个 ID,如果没有隐式分配一个。
【讨论】:
以上是关于@Component 和 @Named 都用于同一个 bean 类的主要内容,如果未能解决你的问题,请参考以下文章
A component required a bean named 'cacheManager' that could not be found.
Vue提示warn[vue-router] Named Route ‘home’ has a default child route…
Vue提示warn[vue-router] Named Route ‘home’ has a default child route…