Java Spring和抽象类-抽象类中的注入属性

Java Spring和抽象类-抽象类中的注入属性,java,spring,Java,Spring,我有一个抽象基类,它有一个名为“mailserver”的属性,我希望从SpringIOC容器中注入该属性。但是,当我运行抽象类的具体实现时,mailserver属性将为null 正确的做法是什么?你试过做这样的事情并且成功了吗?请共享。使用abstract属性将抽象基类定义标记为abstract,并在具体的类定义中,使parent属性成为抽象类的bean名称 大概是这样的: <bean id="abstractBaseClass" abstract="true" class="pacakg

我有一个抽象基类,它有一个名为“mailserver”的属性,我希望从SpringIOC容器中注入该属性。但是,当我运行抽象类的具体实现时,mailserver属性将为null


正确的做法是什么?你试过做这样的事情并且成功了吗?请共享。

使用
abstract
属性将抽象基类定义标记为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中都得到了广泛的使用:例如。演示您如何尝试连接属性,有人可以向您解释为什么它不工作。

在我的例子中,在Spring4应用程序中,我必须使用经典的抽象工厂模式(我的想法来自-)每次都要进行操作时创建实例。因此,我的代码设计如下:

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来扫描整个包,但不知何故,在创建子类实例(如campativeoperation)时,超级抽象类EO的属性为null,因为spring无法识别和注入其依赖项。经过多次尝试和错误后,我使用了此
**@Configurable(dependencyCheck=true)**
annotation,最后Spring能够注入依赖项,并且我能够使用子类中的属性,而不会让它们与太多属性混淆

<context:annotation-config />
<context:component-scan base-package="com.xyz" />

我还尝试了其他参考资料以找到解决方案:


  • 请尝试使用
    **@Configurable(dependencyCheck=true)**
    并更新此帖子,如果您遇到任何问题,我可能会尝试帮助您。

    您需要提供至少您的bean配置xmlabstract,AFAIK,这里的目的不是将类标记为抽象,这与Spring无关,而是为配置中使用的其他bean定义模板-父bean定义。我可以使用spring的自动连接功能进行同样的操作吗?这个答案(将bean标记为抽象)是否与这个问题相关?有人请评论。