我正在从《春天从这里开始》这本书中学习春天.在这里,我向Spring上下文中添加了类Parrot的两个Bean,并试图通过构造函数使用自动连接将Bean Parrot2注入Person类.然而,我一直收到

"通过构造函数参数0表示的不满足的依赖项:没有类型为‘beans.Parrot’的合格Bean.可用的:需要一个匹配的Bean,但发现2:Parrot1,Parrot2"错误.我搞不懂这是怎么发生的,因为我认为不会有问题,因为Person类构造函数参数与parrot2 Bean名称匹配.

配置类:

package config;

import beans.Parrot;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;


    @Configuration
    @ComponentScan(basePackages = "beans")
    public class ProjectConfig {

        @Bean
        public Parrot parrot1() {
            Parrot p = new Parrot();
            p.setName("Koko");
            return p;
        }

        @Bean
        public Parrot parrot2() {
            Parrot p = new Parrot();
            p.setName("Miki");
            return p;
        }
}

鹦鹉类:

package beans;

public class Parrot {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Parrot : " + name;
    }

Person类:

package beans;

import org.springframework.stereotype.Component;

@Component

public class Person {
    private String name = "Ella";

    private final Parrot parrot;

    public Person(Parrot parrot2) {
        this.parrot = parrot2;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Parrot getParrot() {
        return parrot;
    }
}

主班:

package main;

import beans.Person;
import config.ProjectConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        var context = new AnnotationConfigApplicationContext(ProjectConfig.class);

        Person p = context.getBean(Person.class);

        System.out.println("Person's name: " + p.getName());
        System.out.println("Person's parrot: " + p.getParrot());
    }
}

错误:

 Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'beans.Parrot' available: expected single matching bean but found 2: parrot1,parrot2
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'person' defined in file [C:\Users\Ian36\IdeaProjects\BENAS\target\classes\beans\Person.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'beans.Parrot' available: expected single matching bean but found 2: parrot1,parrot2
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:802)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:241)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1354)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:960)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93)
    at main.Main.main(Main.java:9)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'beans.Parrot' available: expected single matching bean but found 2: parrot1,parrot2
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:218)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1420)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789)
    ... 14 more

Process finished with exit code 1

我try 使用@限定符,看看它是否会改变什么,但我仍然收到相同的错误.

推荐答案

默认情况下,-parameter处于禁用状态.

使用POM启用它(从3.6.2开始)或使用-Dmaven.compiler.parameters:

<properties>
    <maven.compiler.parameters>true</maven.compiler.parameters>
<properties>

您可以使用右键单击项目Maven->;Update Project ...来更新eclipse配置

你会得到这样的输出:

grim@main:~/workspace/xxx$ mvn exec:java -Dexec.mainClass=main.Main -Dmaven.compiler.parameters

[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for aaa:xxx:jar:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 27, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO] 
[INFO] ------------------------------< aaa:xxx >-------------------------------
[INFO] Building xxx 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- exec:3.1.1:java (default-cli) @ xxx ---
Person's name: Ella
Person's parrot: Parrot : Miki
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.293 s
[INFO] Finished at: 2024-01-02T18:49:53+01:00
[INFO] ------------------------------------------------------------------------
grim@main:~/workspace/xxx$ 

事理

通常,JDK将类名、字段名和方法名存储在字节码中,而不是存储方法/构造函数参数名.您需要 bootstrap 编译器将方法/构造函数参数名称存储到字节码.只有这样,Spring才能找到合适的自动装配候选者.

Java相关问答推荐

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

Mat. n_Delete()和Mat. n_release的区别

将成为一个比较者.比较…在现代Java中,编译器会对`CompareTo`方法进行优化吗?

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

Apache POI:使用反射获取zoom 级别

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

当涉及到泛型时,类型推理在Java中是如何工作的?

如何获取Instant#of EpochSecond(?)的最大值

我正在try 跟踪数组中最大的两个数字

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

Java Flux中的延迟增加

在ECLIPSE上的M1 Pro上运行JavaFX的问题

如何使用stream.allMatch()为空流返回false?

javax.crypto-密码对象-提供者服务是如何工作的?

当我将鼠标悬停在javafxTextArea上时,如何更改鼠标光标?

Java 21保护模式的穷尽性

Java中计算大n和k值模10^9+7的二项式系数的乘法公式输出错误值