【发布时间】:2011-08-25 02:43:15
【问题描述】:
我有一个抽象基类,它有一个名为“mailserver”的属性,我希望从 spring ioc 容器中注入它。但是,当我运行抽象类的具体实现时,邮件服务器属性为空。
这样做的正确方法是什么?您是否尝试过这样做并成功了?请分享。
【问题讨论】:
-
你至少需要提供你的bean配置xml
我有一个抽象基类,它有一个名为“mailserver”的属性,我希望从 spring ioc 容器中注入它。但是,当我运行抽象类的具体实现时,邮件服务器属性为空。
这样做的正确方法是什么?您是否尝试过这样做并成功了?请分享。
【问题讨论】:
使用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>
【讨论】:
超类中的属性,无论是否抽象,都与 Spring 中的任何其他属性完全相同。您可以使用基于 XML、注释或 Java 配置的 setter、构造函数或字段注入。您会发现在整个 Spring 中都广泛使用继承:例如,DefaultMessageListenerContainer。展示您是如何尝试连接该属性的,有人可以解释为什么它不起作用。
【讨论】:
在我的例子中,在 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,但不知何故在创建像 CampaignOperation、Super Abstract 这样的子类实例时EO 类的属性为 null,因为 spring 无法识别和注入它的依赖项。经过多次试验和错误后,我使用了这个 **@Configurable(dependencyCheck = true)** 注释,最后 Spring 能够注入依赖项,我能够在子类,而不用过多的属性使它们混乱。
<context:annotation-config />
<context:component-scan base-package="com.xyz" />
我还尝试了这些其他参考以找到解决方案:
请尝试使用**@Configurable(dependencyCheck = true)** 并更新此帖子,如果您遇到任何问题,我可能会尝试帮助您。
【讨论】: