printemps permettra à l'autowiring pas de travail à partir d'un non-printemps classe gérée
J'ai une classe (ABC) qui est instancié en appelant le constructeur. De classe ABC a un helper classe (XYZ) injecté à l'aide d'auto-câblé.
Le nôtre est un Spring MVC en fonction de l'application et je ne vois pas d'exception lors du démarrage du serveur.
Mais je vois encore de la Classe XYZ venir comme null. Est-ce à cause du fait que la Classe ABC n'est pas instancié par le Printemps Conteneur?
Dans de tels scénarios, comment puis-je faire usage de l'auto-câblage?
Grâce.
- Je suis sûr que vous ne pouvez pas Autowire haricots qui ne sont pas gérés par le Printemps.. Vous avez besoin pour obtenir la référence d'une instance de XYZ par un autre moyen. Si c'est une classe d'aide rendre les méthodes de XYZ statique et de les utiliser en utilisant le nom de la classe. C'est ce que j'ai fait.
- Veuillez consulter la github.com/ahmedbhaila/non-managed-beans, j'ai essayé et ça fonctionne.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser ce moyen d'utiliser spring bean dans le non-printemps classe d'haricot
vous pouvez maintenant obtenir l'applicationcontext objet par getcontexteapplication() cette méthode.
de applicationcontext vous pouvez obtenir de printemps bean objets comme ceci:
@Component
surApplicationContextUtils
, ou seulement obtenir le nul lors deApplicationContextUtils .getApplicationContext();
Permettra à l'autowiring ne fonctionnera pas parce que la classe ABC n'est pas géré par Spring. Vous pourriez faire le Printemps gérer ABC en utilisant l'un de l' @Composante annotations (@Composant, @Service, @Contrôleur, etc) au-dessus de la définition de la classe, puis à l'aide de context:component-scan dans votre contexte de l'application XML, ou aller vieille école et il suffit de définir le haricot directement dans votre contexte de l'application.
Si pour quelque raison vous ne pouvez pas faire le Printemps de gérer de classe ABC, vous pouvez charger le contexte de l'application de ABC en utilisant quelque chose comme:
et ensuite utiliser:
pour définir manuellement la fève de valeur.
Correct: Vous ne pouvez pas simplement appeler
new
sur une classe et obtenir tout câblé; le Printemps doit être la gestion de la fève pour qu'il fasse toute sa magie.Si vous pouvez poster plus de détails sur votre cas d'utilisation, nous pouvons être en mesure de suggérer des options utiles.
Vous pouvez utiliser le Printemps @Configurable annotations dans la classe que vous souhaitez autowire autres haricots.
En outre, vous aurez besoin d'annoter n'importe quelle configuration de haricot avec @EnableSpringConfigured alors que le Printemps est au courant de votre configurable haricots.
@EnableSpringConfigured documentation
En bref, oui, ABC n'est pas injecté avec XYZ parce que le Printemps n'est pas la gestion de la chaîne ABC. Le printemps ne peut pas configurer les objets qu'il ne connaît pas.
Vous pourriez gérer ABC en annotant avec
@Service
ou@Component
. Notez que pour le Printemps, pour reprendre ces annotations, de Printemps de l'auto-balayage activé:Première question, oui, vous avez nulle, car la classe n'est pas lancé avec le printemps
Deuxième question - je pense que vous pouvez utiliser aspectj soutien http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-using-aspectj
Vous pouvez annoter
ABC
classe avec@Configurable
annotation. Puis le Printemps CIO va injecterXYZ
instance deABC
classe. Il est généralement utilisé avec le AspectJAnnotationBeanConfigurerAspect
.Pour les noobs comme moi qui n'base de Printemps de Démarrage et ne sont pas familiers avec le jargon:
Ashish de réponse fonctionne pour moi, mais cet article fournit une explication un peu plus de l'omi.
Si vous ne connaissez pas le nom du bean vous voulez, essayez de rechercher dans ce tableau:
Si vous êtes confus par le discours de la composante "scan" et des fichiers de configuration, il peut être utile de savoir que l' @SpringBootApplication annotation (que vous pouvez trouver à proximité de votre méthode main ()) appelle implicitement @Configuration et @ComponentScan.
Cela signifie que tous les fichiers dans le paquet (déclarée en haut de la classe principale) sont captés par le Printemps, et tout les haricots que vous souhaitez ajouter peut être écrit aux côtés de main()