Pourquoi ne permettra à l'autowiring de ne pas fonctionner dans un thread?
J'ai fait un projet maven au Printemps 3.0, j'ai fait quelques DAO, des services et des contrôleurs, dans l'un de mes contrôleur-je appeler un service dans lequel j'ai démarrer un thread, le problème est que dans le thread, j'ai déclarer une "variable" qui doit être initialisé avec Autocâblés annotiation, mais il ne fonctionne pas et la variable n'est pas initilized et a la valeur null.
c'est la classe thread
package com.project.tasks;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Component;
import com.project.entities.user.User;
import com.project.services.IUserService;
@Component
public class AddFriendInMyFriendListTaskExecutor {
private class AddFriendInMyFriendListTask implements Runnable {
//HERE IS THE PROBLEM
@Autowired
private IUserService uService;
private User a;
private User b;
public AddFriendInMyFriendListTask() {
;
}
public AddFriendInMyFriendListTask(User aA, User bB) {
a = aA;
b = bB;
}
public User getA() {
return a;
}
public void setA(User a) {
this.a = a;
}
public User getB() {
return b;
}
public void setB(User b) {
this.b = b;
}
public void run() {
//FROM HERE IT PRINTS THE VALUE OF uService THAT IS NULL
System.out.println("uService:" + uService);
uService.insertRightUserIntoLeftUserListOfFriends(a, b);
}
}
private TaskExecutor taskExecutor;
public AddFriendInMyFriendListTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
public void doIt(User a, User b) {
taskExecutor.execute(new AddFriendInMyFriendListTask(a, b));
}
}
c'est le morceau de code qui appelle le fil
User a = uDao.getUser(hrA.getMyIdApp());
User b = uDao.getUser(hrA.getOtherIdApp());
SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
AddFriendInMyFriendListTaskExecutor tmp = new AddFriendInMyFriendListTaskExecutor(taskExecutor);
tmp.doIt(a, b);
Je tiens à souligner que dans tous les autres tests dans lesquels je n'ai pas l'appeler tous les threads, les Autocâblés d'un UserService exemple fonctionne correctement!
La méthode que j'appel: insertRightUserIntoLeftUserListOffriends(l'Utilisateur a Utilisateur b), fonctionne correctement.
OriginalL'auteur user942458 | 2011-09-13
Vous devez vous connecter pour publier un commentaire.
Pour un haricot pour être autocâblés d'ici le Printemps, le haricot doit être une source de haricot (c'est à dire être déclarée dans la context.xml fichier ou être annoté avec une source d'annotation (
@Service
,@Component
, etc.).Et bien sûr, il doit être instancié par un Ressort, et non pas par votre code. Si vous instanciez un Printemps bean-vous avec
new
, le Printemps ne sait pas sur le haricot, et de ne pas injecter quoi que ce soit.Excusez-moi, probablement, je ne comprends pas votre réponse, ou je ne suis pas en mesure d'expliquer mon problème, la création de la AddFriendInMyFriendListTaskExecutor exemple ne marche pas me donner le moindre problème, enfait après le code :"AddFriendInMyFriendListTaskExecutor tmp = new AddFriendInMyFriendListTaskExecutor(taskExecutor);" tmp n'est pas null, le problème est quand j'utilise uService dans la classe AddFriendInMyFriendListTask, il n'y a pas de problème avec la calss et la initilization de AddFriendInMyFriendListTask les instances de
Le printemps doit instancier les beans spring. Pas vous. Vous ne pouvez pas utiliser l'opérateur new pour instancier des beans spring. Ils doivent soit être injecté dans le courant de la fève de Printemps, ou vous devez les obtenir à partir de la fève de l'usine.
OriginalL'auteur JB Nizet
Printemps juste autowires haricots du contexte, aucune des instances créées par la nouvelle. Mais pourquoi avez-vous déclaré
uService
dansAddFriendInMyFriendListTask
et non pas comme un haricot propriété de l'extérieur (haricot) classeAddFriendInMyFriendListTaskExecutor
, qui doivent travailler tout simplement:(supprimé certains inutilisés getter/setter et fait taskExecutor un bean de propriété)
OriginalL'auteur Arne Burmeister
Si vous avez besoin de autowire une instance nouvellement créée (sans prise en charge du conteneur) invoquer
où ctx est votre ApplicationContext et de l'instance l'instance nouvellement créée.
J'ai posé une question similaire ici
OriginalL'auteur stacker
Une autre solution serait d'injecter de l'utilisateur IUserService dans un printemps réussi composant (service, composante, etc.) et de passer à l'injection de valeur dans le constructeur de la classe AddFriendInMyFriendListTask.
Ainsi, le constructeur devient quelque chose comme cela
et retirer le
@Autowired
de la AddFriendInMyFriendListTask classe.OriginalL'auteur aseychell
Eu un problème similaire avait à Autowire dans le service et de passer à la méthode qui implémente runnable par le constructeur.
OriginalL'auteur Xcoder