どのように私はSpringにランタイム固有の設定メタデータを提供しますか?

私はクライアント/サーバーアプリケーションを作成し、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にはたくさんの依存関係がありますので、Springを使用してMyClientインスタンスを作成し、@Injectアノテーションを使用して依存関係を挿入したいと考えています。

ホスト/ポートを構成メタデータとしてSpring構成に渡すにはどうすればよいですか?もし私が何ができない場合は、代わりに推奨されます。私はすべての配線を自分で行うことができますが、それがSpringの目的です。

ジェフ

1

2 答え

スプリングリファレンスの設定部分を確認する必要があります。たとえば、spring 3.xでこのようなBeanを作成することができます。

@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;
    }

}
0
追加された
Beanは実行時に作成されます。これは、これらのsetName、setPriceメソッドをカスタムランタイムロジックで設定できることを意味します。あなたはあらかじめ定義されたプロパティを使用する必要はありません。
追加された 著者 Cemo,
はい。ただし、依然として必要なjetProperties定義を含む事前定義済みプロパティー・ファイルが必要です。私はこれらを実行時に指定したいと思います。おそらく私はこれらの特性をその場で作成することに目を向けることができます。
追加された 著者 user1018319,

私はこれを静的な設定クラスを使って解決しました。

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);
     }
  }
}

それは非常にclunky感じる。より良い方法がありますか?

0
追加された