Dépendance au ressort d'autowire définie dans une classe abstraite

j'ai une" commande " de classe abstraite avec une dépendance @Autowired et des classes étendant la classe abstraite. La dépendance n'est pas injecté. Les classes abstraites et concrètes sont annotées avec @Component et sont scannées. Il semble que la classe de base (abstraite) n'est pas gérée au printemps. Ce qui doit être fait pour qu'il soit? Y a-t-il une annotation pour la définir comme abstraite? Je ne veux pas définir le bean en XML.

public abstract class Command {
  @Autowired
  private SecurityUtils securityUtils;
....

@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class NoteCommand extends Command {
...
}

mon erreur I excuser. Les classes de commande sont injectées dans Mes controllers et l'un d'eux (NoteCommand) a été instancié manuellement via "new". Tout est bon.

2
demandé sur user979051 2013-10-31 22:59:48

2 réponses

cela peut être réalisé avec la configuration XML(pas sûr des annotations). Lisez ce http://docs.spring.io/spring-framework/docs/3.0.0.RC3/reference/html/ch03s07.html

essayez ceci (ajouter d'autres config à la fève de l'enfant?)

<bean id = "command" class = "some.package.name.Command" abstract = "true">
  <property name = "securityUtils" ref = "securityUtils"/>
</bean>

<bean id ="noteCommand" class = "some.package.name.NoteCommand" parent="commadn">

</bean>

santé!

0
répondu kyla 2013-10-31 20:13:02

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. Printemps peut vous autowire à l'intérieur d'une classe abstraite?

s'il vous Plaît essayez d'utiliser **@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:21:24