我有一个超类需要子类来提供超类运行的接口的实现。
我们使用Spring和DI,因此我们不能只使用new创建实现。
子类只知道在初始化Spring之后才提供哪个bean,因此使用超级构造函数将无法工作。
我也不想在子类中使用q @PostConstruct
setup方法,因为这需要子类开发人员知道如何设置超类。
我希望超类要求子类提供对实现bean的引用,以便它可以设置其成员:
超类使用UrlBuilder接口:
public class JsonConnection{
private UrlBuilder urlBuilder;
}
子类通过依赖注入提供实现(UrlBuilderFacebook
)。
@Component
public class FacebookJsonConnection extends JsonConnection {
@Inject
private UrlBuilder urlBuilderFacebook;
}
超类可以是抽象的还是组件,没关系。重要的是,我希望能够创建轻量级子类,为超类提供UrlBuilder
,并在需要时提供@Inject
。
@Inject
private JsonConnection facebookJsonConnection;
或
@Inject
private JsonConnection redmineJsonConnection;
此外,我不希望超类知道哪个子类正在使用它。
答案 0 :(得分:6)
如果urlBuilder
需要JsonConnection
,您可以将其作为构造函数参数传递并使用构造函数注入:
public class JsonConnection{
private UrlBuilder urlBuilder;
public JsonConnection(UrlBuilder urlBuilder) {
this.urlBuilder = urlBuilder;
}
}
@Component
public class FacebookJsonConnection extends JsonConnection {
private UrlBuilder urlBuilderFacebook;
@Inject
public FacebookJsonConnection(UrlBuilder urlBuilderFacebook) {
super(urlBuilderFacebook);
this.urlBuilderFacebook = urlBuilderFacebook;
}
}