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

部署用于全网的跨网段DHCP和DNS服务

vue - 样式不适用于同一文件中的额外组件

Vue提示warn[vue-router] Named Route ‘home’ has a default child route…

Vue提示warn[vue-router] Named Route ‘home’ has a default child route…

终于搞懂了 @Configuration 和 @Component 的区别