为来自超类的字段限定 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);
}
}
如何在实现类中注入我的 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);
}
}