66 votes

Injection de beans dans une classe en dehors du contexte géré par Spring

Je suis un utilisateur de l'un de mes produits de la société. Il n'est pas très approprié pour l'intégration dans le Printemps, mais je suis en mesure d'obtenir une poignée sur le contexte et récupérer le nécessaire bean par nom. Cependant, je voudrais quand même savoir si il était possible d'injecter une fève dans cette classe, même si la classe n'est pas géré par la source elle-même.

Clarification: La même demande, ce qui est la gestion du cycle de vie de certains de la classe Maclasse, est aussi la gestion du cycle de vie du Ressort du contexte. Le printemps n'ont aucune connaissance de l'instance de Maclasse, et je voudrais quelques comment fournir de l'instance dans le cadre, mais ne peut pas créer l'instance dans le contexte lui-même.

68voto

David Tinker Points 3386

Tu peux le faire:

 ApplicationContext ctx = ...
YourClass someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
    someBeanNotCreatedBySpring,
    AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);
 

Vous pouvez utiliser @Autowired et ainsi de suite dans YourClass pour spécifier les champs à injecter, etc.

3voto

Yonatan Maman Points 884

supposons que u ont la suite de la chaîne de dépendances:

A --> B --> C --> x --> y -- > Z

A, B, C sont le printemps géré haricots (construit et géré par sprign cadre) x, y sont vraiment simples Pojo qui construit par votre application, sans ressort d'assistance

maintenant, si vous voulez que y obtiendrez une référence à Z à l'aide de printemps que vous avez besoin d'avoir une "poignée" pour le printemps ApplicationContext

une façon de le faire est de mettre en œuvre ApplicationContextAware interface . Dans ce cas, je suggère que soit A, B ou C sera d'implémenter cette interface et stocker l'applicationContext référence à un membre statique.

prenons donc de Classe C par exemple:

class C implmenets ApplicationContextAware{
    public static ApplicationContex ac;
     void setApplicationContext(ApplicationContext applicationContext)  {
               ac = applicationContext;
     }
 .............
}

maintenant, en classe y, vous devriez avoir:

(Z)(C.ac.getBean("classZ")).doSomething()

HTH -- Yonatan

2voto

HDave Points 6943

Une autre façon de procéder consiste à utiliser AspectJ. Il s'agit de la méthode recommandée pour injecter des beans Spring dans des objets non gérés créés avec l'opérateur new . Voir ceci pour plus de détails:

http://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html

1voto

user1204808 Points 19

La recherche de combos infinis de haricots à ressort à injection automatique dans le pojo applicationcontextaware beanaware etc. m'a encerclé ici, mais cela ne m'a pas fourni une solution suffisamment complète.

Ceci est une bien meilleure mise en œuvre / tutoriel de cet IMO: j'espère que cela aide tout le monde comme ça m'a finalement aidé.

Accès à Spring Beans depuis l'extérieur du contexte Spring

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X