我的大多数课程都看起来像:
@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
。有更清洁的方法吗?谢谢!
答案 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。