Java 自动接线未按类型接线

Java 自动接线未按类型接线,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个接口(X),它有一个打印语句的方法,这个接口有两个实现,分别是X1和X2,还有一个类Y,它有两个对象,分别是X为X1和X2,通过接口自动连接的X。i、 e,如private X和私有X x2

我有一个接口(
X
),它有一个打印
语句的方法,这个接口有两个实现,分别是
X1
X2
,还有一个类
Y
,它有两个对象,分别是
X
X1
X2
,通过接口自动连接的
X
。i、 e,如
private X
私有X x2x.statement()
时,它会打印默认的概要文件语句,但当调用
x2.statement()
时,它仍会打印
x.statement()
而不是
x2.statement()

顺便说一句,我用的是弹簧靴

public interface HelloWorldService {
    public String getGreeting();
}

@Component
@Profile({ "default", "english" })
public class HelloWorldServiceEnglishImpl implements HelloWorldService {
    @Override
    public String getGreeting() {
        return "Hello World";
    }
}

@Component
@Profile("spanish")
public class HelloWorldServiceSpanishImpl implements HelloWorldService {
    @Override
    public String getGreeting() {
        return "Hola Mundo";
    }
}
-


根据设置的值,一次只有一个配置文件处于活动状态,因此您可以打印英语或西班牙语,但不能根据您的配置同时打印英语或西班牙语


您可以查看更多详细信息。

根据设置的值,一次只有一个配置文件处于活动状态,因此您可以打印英文或西班牙文,但不能根据配置同时打印英文或西班牙文


您可以查看更多详细信息。

首先,是什么让您认为其中一个注入的豆子是“英语”豆子,另一个是“西班牙语”豆子。注入由活动概要文件定义的bean的两个实例:“English”bean。此配置文件没有活动的Bean HelloWorldServiceKannadaImpl。所以这两个实例都是HelloWorldServiceEnglishImpl的实例

    //this code is not called. The instance variable is auto-wired by field
    //and the auto-wired bean is the only one available: the English one.
    public void setHelloWorldServiceSpanish(HelloWorldServiceSpanishImpl helloWorldServiceSpanish) {
        this.helloWorldServiceSpanish = helloWorldServiceSpanish;
    }
应该如何:

@Controller
public class GreetingController {

    //will be English or Spanish depending on Active profile.
    @Autowired
    private HelloWorldService helloWorldService;

    public void sayHello() {
        String greeting = helloWorldService.getGreeting();
        System.out.println(greeting);

    }
}

在原始代码中,要么从两个bean中删除
@Profile
,要么更改为
spring.profiles.active=english,西班牙文
,它可能会按照您的预期工作。尽管这两种方法都会破坏基于运行时环境的动态注入bean的整体目的。

首先,您认为其中一种注入bean是“英语”bean,另一种是“西班牙语”bean。注入由活动概要文件定义的bean的两个实例:“English”bean。此配置文件没有活动的Bean HelloWorldServiceKannadaImpl。所以这两个实例都是HelloWorldServiceEnglishImpl的实例

    //this code is not called. The instance variable is auto-wired by field
    //and the auto-wired bean is the only one available: the English one.
    public void setHelloWorldServiceSpanish(HelloWorldServiceSpanishImpl helloWorldServiceSpanish) {
        this.helloWorldServiceSpanish = helloWorldServiceSpanish;
    }
应该如何:

@Controller
public class GreetingController {

    //will be English or Spanish depending on Active profile.
    @Autowired
    private HelloWorldService helloWorldService;

    public void sayHello() {
        String greeting = helloWorldService.getGreeting();
        System.out.println(greeting);

    }
}

在原始代码中,要么从两个bean中删除
@Profile
,要么更改为
spring.profiles.active=english,西班牙文
,它可能会按照您的预期工作。尽管这两种类型都会破坏基于运行时环境动态注入bean的整体目的。

如果您希望能够同时注入相同类型的两个bean,您不应该将它们绑定到概要文件:您可以为它们指定不同的名称

@Component("english")
public class HelloWorldServiceEnglishImpl implements HelloWorldService {
    @Override
    public String getGreeting() {
        return "Hello World";
    }
}

@Component("spanish")
public class HelloWorldServiceSpanishImpl implements HelloWorldService {
    @Override
    public String getGreeting() {
        return "Hola Mundo";
    }
}
然后可以使用@Named(JavaAPI)或@Qualifier(SpringAPI)(如果我没记错的话)注释注入它们

@Named("english") // @Qualifier("english")
@Autowired
private HelloWorldService helloWorldService;

@Named("spanish") // @Qualifier("spanish")
@Autowired
private HelloWorldService helloWorldServiceSpanish;

如果希望能够同时注入相同类型的两个bean,那么不应该将它们绑定到概要文件:可以为它们指定不同的名称

@Component("english")
public class HelloWorldServiceEnglishImpl implements HelloWorldService {
    @Override
    public String getGreeting() {
        return "Hello World";
    }
}

@Component("spanish")
public class HelloWorldServiceSpanishImpl implements HelloWorldService {
    @Override
    public String getGreeting() {
        return "Hola Mundo";
    }
}
然后可以使用@Named(JavaAPI)或@Qualifier(SpringAPI)(如果我没记错的话)注释注入它们

@Named("english") // @Qualifier("english")
@Autowired
private HelloWorldService helloWorldService;

@Named("spanish") // @Qualifier("spanish")
@Autowired
private HelloWorldService helloWorldServiceSpanish;

你能把你的X、X1和X2的代码放在这里吗?@Todd我已经把代码添加到你配置配置文件的地方了?相关的代码似乎是Y,所以我建议发布它。加上有关如何指定活动配置文件的信息。在属性配置文件“spring.profiles.active=english”中,您可以将X、X1和X2的代码放在这里吗?@Todd我已经添加了代码,您在哪里配置了配置文件?相关的代码似乎在Y中,因此我建议发布该代码。加上关于如何指定活动配置文件的信息。在属性配置文件“spring.profiles.active=english”中,这绝对不是真的。可以同时有多个配置文件处于活动状态。即使在你链接的文档中,
dev
hsqldb
都是活动的。这绝对不是真的。可以同时有多个配置文件处于活动状态。即使在您链接的文档中,
dev
hsqldb
也都处于活动状态。