Java 我的@组件有什么问题?

Java 我的@组件有什么问题?,java,spring,Java,Spring,我想自动连接我的组件,但似乎我无法解决它。我知道如何在xml中使用context:annotation-config使用@Autowired&@限定符。但是我怎样才能对组件做同样的工作呢?我的片段是: 我要在其中注入bean的组件。 将注入的我的组件: 我的xml: 然后我尝试运行它,我得到以下错误: 这有什么不对?谢谢 编辑:stacktrace Exception in thread "main" org.springframework.beans.factory.BeanCreationE

我想自动连接我的组件,但似乎我无法解决它。我知道如何在xml中使用context:annotation-config使用@Autowired&@限定符。但是我怎样才能对组件做同样的工作呢?我的片段是:

我要在其中注入bean的组件。 将注入的我的组件: 我的xml: 然后我尝试运行它,我得到以下错误: 这有什么不对?谢谢

编辑:stacktrace

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pianist': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.city.lt.Pianist.makeInstrument(com.city.lt.Instruments); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.city.lt.Instruments] is defined: expected single matching bean but found 2: [guitar, piano]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.city.lt.main.main(main.java:11)
线程“main”org.springframework.beans.factory.BeanCreationException中的异常:创建名为“pianist”的bean时出错:自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动连线方法:public void com.city.lt.Pianist.makeInstrument(com.city.lt.Instruments);嵌套异常为org.springframework.beans.factory.NoSuchBean定义异常:未定义类型为[com.city.lt.Instruments]的唯一bean:应为单个匹配bean,但找到2:[吉他,钢琴] 位于org.springframework.beans.factory.annotation.AutoWiredNotationBeanPostProcessor.postProcessPropertyValues(AutoWiredNotationBeanPostProcessor.java:287) 位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) 位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:585) 位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) 位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139) 位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:83) 位于com.city.lt.main.main(main.java:11)
在setter/constructor/or字段上需要
@Autowired
。 如果您选择了setter,请将其命名为setter

   @Autowired
   public void setInstrument(Instruments instrument) {
       this.instrument = instrument;
   }
创建的所有bean都以小写开头(默认情况下):

问题是您有两种仪器的实现。Spring不知道选择哪一个(因为它真的没有创造性,也不关心音乐)

您需要告诉Spring它应该使用什么。通过使用@Primary注释一个,或将所有实现连接到一个集合中,或使用要连接为字段类型的实现类,或将
@Qualifier(“piano”)
与自动连接的注释一起使用

   @Autowired
   public void makeInstrument(@Qualifier("piano") Instruments instrument) {
       this.instrument = instrument;
   }
如果之后不需要“makeInstrument”方法,则以下方法更容易:

@Component
public class Pianist implements Performer{

   @Autowired
   private Instruments instrument;

    @Override
    public void perform() {

        instrument.play();    
    }
}

看看堆栈跟踪

No unique bean of type [com.city.lt.Instruments] is defined: expected single matching bean but found 2: [guitar, piano]
有两个类实现了
Instruments
接口。默认情况下,使用
@Autowired
时,Spring会按类型执行此操作。因为有两个相同类型的bean,所以它不知道要注入哪一个。(这也是堆栈跟踪告诉您的)


要做到这一点,唯一的方法就是使用
@限定符来指定要注入的限定符。

您能提供stackstrace的更多行吗?Piano是否在同一个包中?i、 e.在
com.city.lt
下?如果不是,则必须在组件scanyes中提供
Piano
的包。是的,它在同一个包中。好的,我会用我的错误的更多信息来编辑它;你可以发布吉他类吗?Autowired不在乎你用什么样的名字来命名这个方法。如果我使用或smth,我需要将约束名称与“set”字一起使用。我没有说这很重要。。。这只是惯例好吧,现在没关系。它的命名是有目的的。我用小写字母改变了我的bean,但结果是一样的……但这怎么可能呢,因为我只有一个乐器实现——钢琴。如果我有两个乐器实现,那就不会错了。因为然后我用@Component注释对我的类进行签名,所以我说这个类的bean应该自动创建。如果我有两个实现,并且我只用@Component对我的工具的一个实现进行了签名,它说,“我只创建了用@Component对类进行签名的bean”,因此应该忽略工具的另一个实现,因为它不会用@Component进行签名。因此,我不需要使用限定符来缩小bean的范围是的,我理解,但是如果我用@Component标记了我仅有的1个instrument实现,我想这意味着“我将用xml创建这个类的bean”,而另一个实现将不会用它来标记。所以我只有一个工具bean的实现,对吗?那么,为什么在运行时,如果我只创建了1个bean(用@Component标记),它会说我有2个bean呢?或者我错过了什么?有两个例子,一把吉他和一架钢琴,这就是错误告诉你的。该bean位于xml中的某个位置,或者也使用支持的注释之一对其进行注释。
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pianist': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.city.lt.Pianist.makeInstrument(com.city.lt.Instruments); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.city.lt.Instruments] is defined: expected single matching bean but found 2: [guitar, piano]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.city.lt.main.main(main.java:11)
   @Autowired
   public void setInstrument(Instruments instrument) {
       this.instrument = instrument;
   }
Performer performer = (Performer)context.getBean("pianist");
   @Autowired
   public void makeInstrument(@Qualifier("piano") Instruments instrument) {
       this.instrument = instrument;
   }
@Component
public class Pianist implements Performer{

   @Autowired
   private Instruments instrument;

    @Override
    public void perform() {

        instrument.play();    
    }
}
No unique bean of type [com.city.lt.Instruments] is defined: expected single matching bean but found 2: [guitar, piano]