我试图了解这两个注释之间的差异以及它们如何影响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/

10-10 10:02