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