Java [SpringBoot]:简单组件无法自动连接字符串类

Java [SpringBoot]:简单组件无法自动连接字符串类,java,spring,spring-boot,controller,inversion-of-control,Java,Spring,Spring Boot,Controller,Inversion Of Control,我有一个简单的组件类: 包杰森; 导入org.springframework.stereotype.Component; @组成部分 公务舱信使{ 私有字符串消息; 公共信使字符串消息{ this.message=消息; } 公共void setMessageString消息{ this.message=消息; } 公共消息{ System.out.println您的消息:+Message; } } 在构造函数的参数中,IntelliJ报告:无法自动连线。未找到“String”类型的bean 这

我有一个简单的组件类:

包杰森; 导入org.springframework.stereotype.Component; @组成部分 公务舱信使{ 私有字符串消息; 公共信使字符串消息{ this.message=消息; } 公共void setMessageString消息{ this.message=消息; } 公共消息{ System.out.println您的消息:+Message; } } 在构造函数的参数中,IntelliJ报告:无法自动连线。未找到“String”类型的bean

这个小玩具项目中还有两个类:Config:

包杰森; 导入org.springframework.context.annotation.Bean; 导入org.springframework.context.annotation.ComponentScan; 导入org.springframework.context.annotation.Configuration; @配置 @ComponentScanbasePackageClasses=Messenger.class 公共类配置{ @豆子 公共信使helloWorld{ 返回新的信使Hello World!; } } 和MainApp:

包杰森; 导入org.springframework.context.ApplicationContext; 导入org.springframework.context.annotation.AnnotationConfigApplicationContext; 公共类MainApp{ 公共静态无效字符串[]args{ ApplicationContext context=new AnnotationConfigApplicationContextConfig.class; Messenger obj=context.getBeanhelloWorld,Messenger.class; obj.getMessage; } } 奇怪的是,除了表面上的编译时错误外,项目还生成了,但在运行时失败了,原因是:

线程主org.springframework.beans.factory.UnsatifiedDependencyException中出现异常:创建名为“messenger”的bean时出错[C:\Users\jasonfil\code\green taxi\target\classes\jason\messenger.class]:通过构造函数参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为“java.lang.String”的符合条件的bean可用:至少需要1个符合autowire候选条件的bean。依赖项批注:{}
我做错了什么?SpringBoot的新功能。可能存在IOC错误概念。

您正在使用Java配置类型Bean注册以及组件扫描类型Bean注册


最快的解决方案是从Messenger类中删除@Component。

您正在使用Java配置类型Bean注册以及组件扫描类型Bean注册


最快的解决方案是从Messenger类中删除@Component。

您将bean注入的两种方式与Messenger类混合,使用@Component进行基于注释的注入,并在配置类中将其声明为一个bean,使用@bean

当您尝试使用带有激活组件扫描的AnnotationConfigApplicationContext注入Messenger时,Spring将首先使用基于注释的注入,所以@component

因此Spring将调用默认构造函数来注入bean,当然,如果没有基于构造函数的自动连接,那么您需要将默认构造函数添加到Messenger。如果没有默认构造函数,Spring将使用可用的构造函数,因此将得到上面的错误。当然,您需要删除@Bean配置,因为您没有使用它: 包杰森

import org.springframework.stereotype.Component;

@Component
public class Messenger {

    private String message;

    public Messenger() {
    }

    public Messenger(String message) {
        this.message = message;
    }

    public void setMessage(String message){
        this.message  = message;
    }

    public void getMessage(){
        System.out.println("Your Message : " + message);
    }
}
或者,如果要使用bean配置,可以从Messenger中删除@Component,也可以删除@ComponentScan:


您将bean注入的两种方式与Messenger类混合,基于注释的注入与@Component,并在配置类中将其声明为bean与@bean

当您尝试使用带有激活组件扫描的AnnotationConfigApplicationContext注入Messenger时,Spring将首先使用基于注释的注入,所以@component

因此Spring将调用默认构造函数来注入bean,当然,如果没有基于构造函数的自动连接,那么您需要将默认构造函数添加到Messenger。如果没有默认构造函数,Spring将使用可用的构造函数,因此将得到上面的错误。当然,您需要删除@Bean配置,因为您没有使用它: 包杰森

import org.springframework.stereotype.Component;

@Component
public class Messenger {

    private String message;

    public Messenger() {
    }

    public Messenger(String message) {
        this.message = message;
    }

    public void setMessage(String message){
        this.message  = message;
    }

    public void getMessage(){
        System.out.println("Your Message : " + message);
    }
}
或者,如果要使用bean配置,可以从Messenger中删除@Component,也可以删除@ComponentScan:


你说得对。这里的问题当然是,该解决方案将帮助我运行项目,但我失去了Messenger的组件行为,这是我所需要的。很明显,我混淆了我在ApplicationContext中将Messenger声明为bean的方式。你是对的。这里的问题当然是,该解决方案将帮助我运行项目,但我失去了Messenger的组件行为,这是我所需要的。我显然混淆了在我的应用程序上下文中将Messenger声明为bean的方式。