spring DI with dynamic constructor arguments

时间:2017-07-21 21:18:55

标签: java spring

我的大多数课程都看起来像:

@Component
public class MyClassImpl implements MyClass {

   private MyService service;

   @Autowired
   public MyClass(MyService service) {
      this.service = service;
   }
}

这对我有意义,但如果我想做这样的事情:

@Component
public class MyClassImpl implements MyClass {

   private MyService service;
   private String id;       // this is what I need

   @Autowired
   public MyClass(MyService service, String id) {
      this.service = service;
      this.id = id;
   }
}

但问题是String id直到运行时才知道。有没有办法做到这一点?据我所知,Spring在运行时默认检查所有依赖项,所以如果我尝试第二个例子,它会抱怨构造函数参数。我已经看到了一些例子,你可以使用工厂在线下创建实际值。或者我可以创建getter和setter以便在需要时设置id,但这也意味着我还需要将这些getter和setter添加到接口MyClass。有更清洁的方法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以为id创建一个@Bean方法,并使用逻辑来计算它。

@Configuration
public class Config {
    @Bean
    public String idForService() {
        return calculateId();
    }
}

然后您的服务构造函数将如下所示

   @Autowired
   public MyClass(MyService service, @Qualifier("idForService") String id) {
      this.service = service;
      this.id = id;
   }

但正如其他人已经提到的那样,这看起来是一种不好的做法,所以你最好考虑重新设计你的服务类。

答案 1 :(得分:0)

我担心你想要做的事情并不符合Spring创造的精神。请查看:Runtime dependency injection with Spring

话虽如此,您的问题可能会有解决方法。 如果你有一些为你计算ID的类,只需在构造函数中注入该类,并将其计算结果绑定到类中的字段id。