Le printemps peut vous autowire à l'intérieur d'une classe abstraite?

le ressort ne parvient pas à autowire mon objet? Est-il possible d'autowire un objet dans une classe abstraite. Supposons que tous les schémas sont fournis dans le contexte de l'application.xml

Question: Quelle annotation devrait figurer sur le composant "base" et "extension des classes" (le cas échéant)?

exemple

abstract class SuperMan {

    @Autowire
    private DatabaseService databaseService;

    abstract void Fly();

    protected void doSuperPowerAction(Thing thing) {

        //busy code

        databaseService.save(thing);

    }
}

extension de la classe

public class SuperGirl extends SuperMan {

    @Override
    public void Fly() {
        //busy code
    }

    public doSomethingSuperGirlDoes() {

        //busy code

        doSuperPowerAction(thing)

    }

de l'application de contexte.xml

<context:component-scan base-package="com.baseLocation" />
<context:annotation-config/>
39
demandé sur Ahmed Ashour 2013-11-14 02:32:34

3 réponses

Normalement, le ressort devrait faire l'autodiagnostic, aussi longtemps que votre classe abstraite est dans le paquet de base prévu pour le scan de Composant.

Voir ce et ce pour plus de référence.

@Service et @Component sont tous deux des stéréotypes qui créent des haricots annotés à l'intérieur du contenant à ressort. Comme L'indiquent les Docs du printemps,

cette annotation sert comme une spécialisation de @Composant, permettant classes d'implémentation à autodétecter par classpath scanning.

23
répondu Andrei Nicusan 2017-05-23 12:18:09

j'ai ce genre d'installation de ressort qui fonctionne

une classe abstraite avec un autocâblés champ

public abstract class AbstractJobRoute extends RouteBuilder {

    @Autowired
    private GlobalSettingsService settingsService;

et plusieurs enfants définis par @Component annotation.

27
répondu Frederic Close 2017-12-22 18:08:15

dans mon cas, à l'intérieur D'une application Spring4, j'ai dû utiliser un modèle D'usine abstrait classique (pour lequel j'ai pris l'idée de - http://java-design-patterns.com/patterns/abstract-factory / ) pour créer des instances à chaque fois qu'il y avait une opération à faire.Donc mon code devait être conçu comme:

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);
    }
}

initialement pour injecter les dépendances dans la classe abstraite j'ai essayé toutes les annotations stéréotypées comme @Component, @Service etc mais même si Spring context file avait ComponentScanning pour L'ensemble du paquet, mais d'une manière ou d'une autre tout en créant des instances de sous-classes comme CampaignOperation, la classe super Abstract EO avait null pour ses propriétés car spring était incapable de reconnaître et d'injecter ses dépendances.Après beaucoup d'essais et d'erreurs j'ai utilisé cette annotation **@Configurable(dependencyCheck = true)** et finalement Spring a pu injecter les dépendances et j'ai pu utiliser les propriétés dans la sous-classe sans les encombrer avec trop de propriété.

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

j'ai aussi essayé ces autres références pour trouver une solution:

  1. http://www.captaindebug.com/2011/06/implementing-springs-factorybean.html#.WqF5pJPwaAN
  2. http://forum.spring.io/forum/spring-projects/container/46815-problem-with-autowired-in-abstract-class
  3. https://github.com/cavallefano/Abstract-Factory-Pattern-Spring-Annotation
  4. http://www.jcombat.com/spring/factory-implementation-using-servicelocatorfactorybean-in-spring
  5. https://www.madbit.org/blog/programming/1074/1074/#sthash.XEJXdIR5.dpbs
  6. Utilisation de résumé d'usine avec le framework Spring
  7. Printemps permettra à l'autowiring pas de travail pour les classes Abstraites
  8. Injecter du printemps de la dépendance en résumé super classe
  9. le Printemps et classe Abstraite - l'injection de propriétés dans les classes abstraites
    1. dépendance de ressort d'autowire défini dans une classe abstraite

s'il vous Plaît essayer en utilisant **@Configurable(dependencyCheck = true)** et mettre à jour ce post, je pourrais essayer de vous aider si vous faites face à des problèmes.

1
répondu user1295235 2018-03-09 23:26:46