我必须创建四个类型为JmsTemplate的Beans,并且我传递的值是#34; incomingqueue"从属性文件中读取。 我想要四个不同的值来自四个不同占位符的属性文件,如下面提到的代码
@Value("${ibm.mq.incomingqueue}")
但我还有其他三个占位符,如
@Value("${ibm.mq.incomingqueue1}")
@Value("${ibm.mq.incomingqueue2}")
@Value("${ibm.mq.incomingqueue3}")
并使用这些不同的属性我需要4个不同的bean。
有什么方法可以让所有这4个占位符'我的属性中的值并注入bean?
@Value("${ibm.mq.incomingqueue}")
private String incomingqueue;
@Bean
public org.springframework.jms.core.JmsTemplate provideJmsTemplate()
throws JMSException {
org.springframework.jms.core.JmsTemplate jmsTemplate = new
org.springframework.jms.core.JmsTemplate(provideUserCredentialsConnectionFactory
Adapter());
jmsTemplate.setDefaultDestinationName(incomingqueue);
return jmsTemplate;
}
答案 0 :(得分:0)
如果在不同的环境中需要它们(例如queue1用于登台,queue2用于生产等等),那么每次执行应用程序上下文中基本上只有1个JmsTemplate bean。
在这种情况下,只需使用不同的配置文件,或者如果您在Spring4 + @Conditional
上加载不同的bean。如果您可以将配置解耦以仅为不同的环境提供不同的队列名称,那么更好 - 您甚至不需要在那里进行任何条件配置。
现在,如果您一次需要4个队列,答案是不同的:
JMSTemplate bean有一个单例范围,它可以一次只使用一个队列,就像我在你的例子中看到的那样(免责声明,我自己并没有使用过JMSTemplate)。所以你需要4种不同的豆子。在使用依赖注入时,您如何区分它们?
以下是使用Java配置的示例:
@SpringBootApplication
public class SampleMicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(SampleMicroserviceApplication.class, args);
}
@Bean
public Person john() {
return new Person("John");
}
@Bean(name = "jack")
public Person jack(){
return new Person("Jack");
}
@Bean(initMethod = "init") // which person (jmsTemplate in your case to inject here???
public Printer printer(Person p){
return new Printer(p);
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
class Printer {
private Person p;
public Printer(Person p) {
this.p = p;
}
public void init() {
System.out.println(p.toString());
}
}
}
这样的配置在Spring中会失败,因为它不知道应该在Printer类中实际注入什么。
解决这个问题的一种方法是使用" @ Qualifier"注解: 给bean注释中的人命名,如下所示:
@Bean(name = "john")
public Person john(){
return new Person("John");
}
@Bean(name = "jack")
public Person jack(){
return new Person("Jack");
}
然后在bean中指定您希望与谁合作:
@Bean(initMethod = "init")
public Printer printer(@Qualifier("jack") Person p){
return new Printer(p);
}
现在上下文将成功启动。当然,在您的示例中,您将使用具有不同队列名称的不同JMS模板实例,而不是人员。