如何为Spring提供特定于运行时的配置元数据?

时间:2011-10-28 12:48:23

标签: java spring dependency-injection factory

我正在编写一个客户端/服务器应用程序并使用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的用途。

杰夫

2 个答案:

答案 0 :(得分:0)

您应该检查弹簧参考的配置部分。例如,您可以使用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;
    }

}

答案 1 :(得分:0)

我使用静态配置类解决了这个问题。

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

但感觉非常笨重。还有更好的方法吗?