我试图了解这两个注释之间的差异以及它们如何影响Spring中的注入。考虑下面的代码-
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ExternalPropertiesHolder {}
当我用此注释标记课程时-
@ExternalPropertiesHolder
public class SomeProperties {}
然后使用
@Inject
注入此依赖项,即可正常运行-@Service
public class SomeService {
private SomeProperties someProperties;
@Inject
public SomeService(SomeProperties someProperties) {
this.someProperties = someProperties;
}
}
但是,当我用
@Component
替换@Named
时-@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Named // --> Here!
public @interface ExternalPropertiesHolder {}
然后注入失败,并出现通常的bean找不到异常-
造成原因:
org.springframework.beans.factory.NoSuchBeanDefinitionException:否
已找到类型为[com.hogehoge.SomeProperties]的合格Bean
依赖关系:期望至少有1个符合自动装配条件的bean
此依赖项的候选者。依赖项注释:{}
我搜索了Spring参考文档,并说了关于is this的区别-
JSR-330没有提供可组合的模型,只是一种识别方法
命名组件。
这意味着什么?这是否意味着我不能使用
@Named
组成这样的自定义标记?还是还有别的东西?附注:当然,在
@Component
中我指的是org.springframework.stereotype.Component
,在@Named
中我指的是javax.inject.Named
。 最佳答案
因此,我直接从Juergen Hoeller获得了答案。 According to him,此行-
JSR-330没有提供可组合的模型,只是一种识别方法
命名组件。
表示javax.inject.Named
只能在给定的bean类上直接声明。可组合的注释故事仅与Spring自己的注释一起使用,这正是我所怀疑的。
关于java - Spring-@Named和@Component之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36203489/