如何注入可在运行时更改的值?

时间:2014-08-19 19:47:38

标签: java spring configuration dependency-injection runtime

应用程序中有一堆(~100)配置参数。它们可以在运行时通过JMX手动调整(非常罕见)。它们的类型各不相同,但通常这些是简单类型,JodaTime的日期时间类型等等。

现在看起来如何:

class Process {
    @Autowired
    private ConfigurationProvider config;

    public void doIt(){
        int x = config.intValue(Parameters.DELAY));
    }
}

我喜欢它的样子:

class Process {
    @Parameter(Parameters.DELAY)
    private int delay;

    public void doIt(){
        int x = delay;
    }
}

如果不可能,我可以满足(但我真的更喜欢前一个):

class Process {
    @Parameter(Parameters.DELAY)
    private Param<Integer> delay;

    public void doIt(){
        int x = delay.get();
    }
}

有可能吗?它需要在运行时重新注入,但我不确定如何实现它。

如果不可能,那么最接近的选择是什么?我想另一个选择是注入一些参数包装器,但是我需要为每个参数定义一个bean吗?

1 个答案:

答案 0 :(得分:1)

检查Spring的JMX Integration。您应该可以执行以下操作:

@ManagedResource(objectName="bean:name=process", description="Process Bean")
public class Process {

   private int delay;

   @ManagedAttribute(description="The delay attribute")
   public int getDelay() {
      return delay;
   }

   public void setDelay(int delay) {
      this.delay = delay;
   }

   public void doIt(){
      int x = getDelay();
   }
}

但是,如果在多个bean中使用配置属性,或者您通常同时修改多个属性,我认为最好将ConfigurationProvider用作@ManagedResource ,保持配置集中。