Permettra à l'autowiring les Tâches envoyées au Printemps TaskExecutor
Comment pouvez-vous avoir une classe qui implémente Runnable et soumis à ressorts TaskExecutor autocâblés?
Par exemple, j'ai une Tâche:
public class MyTask implements Runnable {
@Autowired private MyRepository myRepository;
@Override
public void run() {
myRepository.doSomething();
}
}
Et un service qui envoie une tâche pour le printemps TaskExecutor:
@Service
public class MyService {
@Autowired private TaskExecutor taskExecutor;
public void someMethod() {
MyTask myTask = new MyTask();
taskExecutor.execute(myTask);
}
}
Je sais que les champs ne sont pas autocâblés parce que MyTask est arriver instancié en utilisant de nouveaux MyTask(). Cependant, comment puis-je contourner ce problème? Devrais-je avoir accès à du Printemps ApplicationContext et de créer de la fève à travers elle? Comment voulez-vous faire cela dans une application web d'environnement?
Merci!
OriginalL'auteur Brian DiCasa | 2013-04-18
Vous devez vous connecter pour publier un commentaire.
Il y a au moins deux bonnes façons de le faire à l'aide de Printemps. Tout d'abord, le @Configurable annotation. L'utilisation de ce moyen une dépendance sur AspectJ, mais il vous permettra d'injecter des haricots qui ne sont pas gérés par un Ressort (c'est à dire que vous êtes à l'aide de l'opérateur new). Cela impliquerait l'annotation MyTask avec @Configurable, et l'ajout de quelques lignes de votre Ressort de configuration comme indiqué dans le lien.
}
La deuxième approche consisterait à l'aide de la ServiceLocatorFactoryBean fonction du Printemps pour créer un prototype de haricots. C'est mieux expliqué dans le JavaDoc, mais dans ce cas, vous donneriez un TaskFactory dans votre @Service annoté de la classe, tout comme n'importe quel autre bean et faire quelque chose comme ça:
}
MyTask serait déjà injecté avec votre référentiel, comme vous pouvez le configurer dans votre mappage XML. J'utilise ces deux approches sur une base quotidienne, mais j'ai tendance à privilégier la seconde que son plus facile à lire et permet de garder les développeurs honnêtes en s'assurant de ne pas faire des choses qui ne sont pas facilement vérifiable, et franchement, c'est plus clair pour l'observateur occasionnel.
OriginalL'auteur jonathan.cone
essayer
ou vous pouvez déclarer MyTask du scope = "prototype" et de modifier MyService comme
Il y a une autre façon, de voir la mise à jour
comment puis-je définis MyTask comme prototype?
Si vous utilisez le Printemps xml de configuration, puis ajouter le scope="prototype" attr à Matache bean définition
OriginalL'auteur Evgeniy Dorofeev