2010-11-29 6 views
3

J'ai récemment demandé this question concernant l'extraction de beans d'un applicationContext. La réponse était en effet utile, mais il semble maintenant que j'ai un problème avec l'accès à ce bean d'une classe en dehors du test. En d'autres termes, mon test instancie une classe qui utilise un bean issu d'un contexte d'application, mais ce bean continue à être nul.Alors maintenant, pourquoi mon bean est nul?

Mon test met en place le contexte d'application comme ceci:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "/applicationContext-test.xml") 
public class SearcherTests { 

Mon test instancie programme de la classe du référentiel:

Repository searcher = new Repository(); 

Ma classe Repository a la variable membre suivante:

@Resource 
private MyFactory myFactory; 

Si je comprends correctement Spring, cela devrait se tourner vers l'application actuelle le contexte d'un bean nommé myFactory. Selon le test, le contexte de l'application actuelle devrait être applicationContext-test.xml, qui contient une définition pour myFactory:

<bean id="myFactory" 
    name="myFactory" 
    class="com.foo.Mocks" 
    factory-method="createMockFactory" /> 

À l'avenir, cette méthode d'usine retournera une maquette. Mais pour le moment, il retourne juste un objet Factory régulier:

public class Mocks { 

public static MyFactory createMockFactory() { 
    return new MyFactory(); 
} 
} 

Quand je lance l'application de mon navigateur, la variable myFactory a été correctement instancié de la définition du haricot applicationContext.xml. Dans mon test, pour m'assurer que mon applicationContext-test.xml fonctionne, j'ai ce même bean listé comme variable membre comme je le fais dans la classe Repository. Lors de l'exécution du test, la variable myFactory dans le fichier contenant le test ressemble exactement à ce à quoi je m'attendais. Toutefois, lorsque j'arrive à la classe Repository, la variable myFactory dans cette classe est null. Il semble que cette classe n'instancie pas la variable myFactory en fonction de la définition du bean dans applicationContext-test.xml. Quelqu'un peut-il me dire pourquoi?

Mise à jour

j'ai changé la variable searcher de sorte qu'il est un grain de printemps, plutôt que instancier la classe Repository manuellement, et maintenant la variable myFactory a été peuplée dans la classe Repository. Quelqu'un peut-il expliquer pourquoi cela doit être un haricot pour travailler?

+1

Comment obtient-il 'Repository'? Est-ce un haricot de printemps? – axtavt

+0

Non, le référentiel n'est pas un bean Spring. Mon test instancie réellement une classe, qui à son tour instancie la classe Repository. Toute cette instanciation est faite par programme. – Samo

+0

J'ai changé Repository pour être un haricot de printemps et cela fonctionne maintenant. Je ne sais pas pourquoi il doit être un haricot pour que cela fonctionne. * scratches head * – Samo

Répondre

3

Si vous instanciez Repository vous-même, Spring ne sera pas impliqué et les dépendances ne seront pas injectées. Cela ne se produit pas magiquement, Spring doit être en quelque sorte en boucle - l'instance doit être passée à travers des couches de traitement Spring, et une instanciation directe empêche cela.

+0

Cette classe est instanciée directement dans le code de l'application, et pourtant la dépendance est très bien injectée. La seule différence dont je suis conscient entre ces deux scénarios est que lorsque l'application est en cours d'exécution, le fichier applicationContext est chargé par web.xml.Cependant, je suis nouveau au printemps donc il peut y avoir d'autres différences dont je ne suis pas au courant. Si vous pouviez clarifier cela, je l'apprécierais, car j'aimerais mieux comprendre le printemps. – Samo

Questions connexes