具有不同属性值的类的多个Bean

时间:2018-02-02 05:14:52

标签: java spring dependency-injection annotations

我必须创建四个类型为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;
}

1 个答案:

答案 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模板实例,而不是人员。