Как предоставить метаданные конфигурации, специфичные для среды выполнения, в Spring? - PullRequest
1 голос
/ 28 октября 2011

Я пишу клиент-серверное приложение и настраиваю его с помощью Spring.

Мой клиентский интерфейс обрабатывает запросы к серверу и обрабатывает ответы.

На данный момент у меня естьфабрика, которая выглядит примерно так:

public class ClientFactory {
    private ApplicationContext ctx;
  public ClientFactory(){
    ctx = new AnnotationConfigApplicationContext(MyConfig.class);
  }

  public MyClient(String host, int port){
    MyClient client = ...
    // create a connection to the server
    return client;
  }
}

Теперь у MyClient есть куча зависимостей, которые я хотел бы внедрить, поэтому я хотел бы создать экземпляр MyClient с помощью Spring и использовать аннотации @Inject для внедрениязависимости.

Как передать хост / порт в качестве метаданных конфигурации в конфигурацию Spring?Если я не могу, что является рекомендуемой альтернативой.Я мог бы сделать всю проводку самостоятельно, но тогда это то, для чего нужна Spring.

Jeff

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Я решил это, используя класс статической конфигурации.

public class ClientFactory {
    private ApplicationContext ctx;
  public ClientFactory(){
    ctx = new AnnotationConfigApplicationContext(MyConfig.class,ServerConfig.class);
  }

  public MyClient(String host, int port){
    MyClient client = ...
    // create a connection to the server
    return client;
  }

  @Data
  @AllArgsConstructor
  public static class ServerDetails{
     private int port;
     private String host;
  }

  @Configuration
  public static class ServerConfig{
     static String host;
     static int port;

     @Bean
     public void serverDetails(){
        return new ServerDetails(host, port);
     }
  }
}

Хотя это кажется очень неуклюжим. Есть ли лучший способ?

0 голосов
/ 28 октября 2011

Вы должны проверить конфигурационную часть ссылки на пружину. Например, вы можете создать такие бобы с помощью Spring 3.x.

@Configuration
// spring config that loads the properties file
@ImportResource("classpath:/properties-config.xml")
public class AppConfig {

    /**
     * Using property 'EL' syntax to load values from the
     * jetProperties value
     */
    private @Value("#{jetProperties['jetBean.name']}") String name;
    private @Value("#{jetProperties['jetBean.price']}") Long price;
    private @Value("#{jetProperties['jetBean.url']}") URL url;

    /**
     * Create a jetBean within the Spring Application Context
     * @return a bean
     */
    public @Bean(name = "jetBean")
    JetBean jetBean() {
        JetBean bean = new JetBeanImpl();
        bean.setName(name);
        bean.setPrice(price);
        bean.setUrl(url);
        return bean;
    }

}
...