我有一个接口(X
),其中有一个打印出statement
的方法,接口有2个X1
和X2
的实现,并且有这个类Y
其中有X
个X1
对象按类型X2
和private X x;
进行了自动装配。即,像private X x2;
和x.statement()
一样,当我调用x2.statement()
时,它会打印默认的配置文件语句,但是当调用x.statement()
时,它仍会打印x2.statement()
打印语句而不是of 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";
}
}
。
顺便说一下,我正在使用Spring启动。
@Controller
public class GreetingController {
@Autowired
private HelloWorldService helloWorldService;
@Autowired
private HelloWorldService helloWorldServiceSpanish;
public void setHelloWorldServiceSpanish(HelloWorldServiceSpanishImpl helloWorldServiceSpanish) {
this.helloWorldServiceSpanish = helloWorldServiceSpanish;
}
public void setHelloWorldService(HelloWorldService helloWorldService) {
this.helloWorldService = helloWorldService;
}
public String sayHello() {
String greeting = helloWorldService.getGreeting();
System.out.println(helloWorldServiceSpanish.getGreeting());
System.out.println(greeting);
return greeting;
}
}
-
(x1, y1)
答案 0 :(得分:2)
首先,是什么让你觉得其中一个注入的豆子将是英语'豆和一个将是'西班牙语'豆。您注入了由活动配置文件定义的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,spanish
,它可能会按预期工作。虽然这两种方法都有失败的目的,即根据运行时环境动态注入bean。
答案 1 :(得分:0)
同时,根据设定值,只有一个配置文件处于活动状态,因此您可以打印英语或西班牙语,但不能同时打印您的配置。
您可以查看here了解详情。
答案 2 :(得分:0)
如果您希望能够同时注入相同类型的两个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(java api)或@Qualifier(spring api)注入它们(如果我没记错的话)注释
@Named("english") // @Qualifier("english")
@Autowired
private HelloWorldService helloWorldService;
@Named("spanish") // @Qualifier("spanish")
@Autowired
private HelloWorldService helloWorldServiceSpanish;