为来自超类的字段限定 Spring 依赖注入

Qualifying Spring dependency injection for field from superclass

如何在实现类中注入我的 webServiceTemplate

我的例子:

public abstract class AbstractConnector {

    protected WebServiceTemplate webServiceTemplate;

    protected Object send(Object message) {
        return webServiceTemplate.marshalSendAndReceive();

   }

}

在我的具体实现中,我想这样设置我的 webServiceTemplate

public class MyConnector extends AbstractConnector {

   @Resource(name = "myWebService")
   private WebServiceTemplate webServiceTemplate;
}

但这不行。如果我调用 send(),那么我将得到 NPE,因为 webServiceTemplate 为空。如何在 send() 方法中访问的实现中设置此依赖项?

最好尽可能避免字段注入,这就是一个例子。构造函数注入使这变得简单:

public abstract class AbstractConnector {
    private final WebServiceTemplate webServiceTemplate;

    protected AbstractConnector(WebServiceTemplate webServiceTemplate) {
        this.webServiceTemplate = webServiceTemplate;
    }
}

@Service
public class MyConnector extends AbstractConnector {

    @Inject // or @Autowired
    public MyConnector(@Qualifier("myWebService") WebServiceTemplate webServiceTemplate) {
        super(webServiceTemplate);
    }
}

您可以使用 method-lookup:

你摘要class:

public abstract class AbstractConnector 
{

private abstract WebServiceTemplate getWebServiceTemplate();

protected Object send(Object message) 
{
    return getWebServiceTemplate().marshalSendAndReceive();
}

您的配置:

   <bean id="webServiceTemplate" scope="prototype" class="com.example.WebServiceTemplate" />
   <bean id="connector" class="com.example.AbstractConnector"
        <lookup-method name="webServiceTemplate" bean="webServiceTemplate" />
    </bean>
如果调用方法 getWebServiceTemplate()

Spring 会将抽象 class 连接到 return 一个新的 webServiceTemplate

我不明白为什么字段注入在这里会变得不那么简单:

public abstract class AbstractConnector {
    protected WebServiceTemplate webServiceTemplate;

    public void setWebServiceTemplate(WebServiceTemplate template) {
        this.webServiceTemplate = template;
    }
}

public class MyConnector extends AbstractConnector {

    @Autowired("myWebService")
    @Override
    public void setWebServiceTemplate(WebServiceTemplate template) {
        super.setWebServiceTemplate(template);
    }
}