我有一个抽象基类,其中包含一个名为“mailserver”的属性,我希望从spring ioc容器中注入该属性。但是,当我运行抽象类的混凝土实现时,我得到了mailserver属性的null。
这样做的正确方法是什么?你有没有试过这样做并取得成功?请分享。
答案 0 :(得分:12)
使用abstract
属性将抽象基类定义标记为抽象,并在具体类定义中,使parent
属性成为抽象类的bean名称的名称
这样的事情:
<bean id="abstractBaseClass" abstract="true" class="pacakge1.AbstractBaseClass">
<property name="mailserver" value="DefaultMailServer"/>
</bean>
<bean id="concreteClass1" class="pacakge1.ConcreteClass1" parent="abstractBaseClass">
<!--Override the value of the abstract based class if necessary-->
<property name="mailserver" value="AnotherMailServer"/>
</bean>
答案 1 :(得分:2)
超类中的属性(抽象与否)与Spring中的任何其他属性完全相同。您可以使用基于XML,注释或Java配置的setter,构造函数或字段注入。你可以在整个Spring中找到广泛使用的继承:例如DefaultMessageListenerContainer。展示你如何尝试连接财产,有人可以解释为什么它不起作用。
答案 2 :(得分:0)
在我的情况下,在Spring4应用程序中,我必须使用经典的抽象工厂模式(我从这个想法 - http://java-design-patterns.com/patterns/abstract-factory/)创建实例,每次都有一个操作要完成所以我的代码设计如下:
public abstract class EO {
@Autowired
protected SmsNotificationService smsNotificationService;
@Autowired
protected SendEmailService sendEmailService;
...
protected abstract void executeOperation(GenericMessage gMessage);
}
public final class OperationsExecutor {
public enum OperationsType {
ENROLL, CAMPAIGN
}
private OperationsExecutor() {
}
public static Object delegateOperation(OperationsType type, Object obj)
{
switch(type) {
case ENROLL:
if (obj == null) {
return new EnrollOperation();
}
return EnrollOperation.validateRequestParams(obj);
case CAMPAIGN:
if (obj == null) {
return new CampaignOperation();
}
return CampaignOperation.validateRequestParams(obj);
default:
throw new IllegalArgumentException("OperationsType not supported.");
}
}
}
@Configurable(dependencyCheck = true)
public class CampaignOperation extends EO {
@Override
public void executeOperation(GenericMessage genericMessage) {
LOGGER.info("This is CAMPAIGN Operation: " + genericMessage);
}
}
最初为了在抽象类中注入依赖项,我尝试了所有构造型注释,如@ Component,@ Service等,但即使Spring上下文文件具有整个包的ComponentScanning,但在某种程度上创建Subclasses的实例,如CampaignOperation,Super Abstract由于Spring无法识别并注入其依赖项,因此类EO的属性为null。经过多次试验和错误后,我使用了这个**@Configurable(dependencyCheck = true)**
注释,最后Spring能够注入依赖项,并且我能够使用这些属性在子类中没有使用太多属性使它们混乱。
<context:annotation-config />
<context:component-scan base-package="com.xyz" />
我也尝试过这些其他参考资料来找到解决方案:
请尝试使用**@Configurable(dependencyCheck = true)**
并更新此帖子,如果您遇到任何问题,我可以尝试帮助您。