【问题标题】:Java Spring - Inject a parameter into a superclass with annotationsJava Spring - 将参数注入带有注释的超类
【发布时间】:2012-05-07 00:14:48
【问题描述】:

我有一个超类,它需要子类来提供超类所针对的接口的实现。

我们使用 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;

另外,我不希望超类知道哪个子类正在使用它。

【问题讨论】:

    标签: java spring inheritance dependency-injection superclass


    【解决方案1】:

    如果JsonConnection 需要urlBuilder,您可以将其作为构造函数参数传递并使用构造函数注入:

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

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多