AnnotationConfigApplicationContext n'a pas encore actualisée
Je suis en train d'élaborer un spring MVC de l'application. Lorsque j'essaie d'utiliser AnnotationConfigApplicationContext dans ma classe de contrôleur, j'obtiens l'erreur suivante. Je n'ai aucune idée de ce que cette déclaration signifie exactement.
@RequestMapping(value = "/generate", method = RequestMethod.POST)
public ModelAndView generateMappingFile(@ModelAttribute Mapping mapping)
{
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
MappingFileGenerator mfg = ctx.getBean(MappingFileGenerator.class);
}
Message d'erreur -->
java.lang.IllegalStateException:org.springframework.context.annotation.AnnotationConfigApplicationContext@116b3c0 has not been refreshed yet
Quelqu'un peut-il m'expliquer ce qui s'est passé ici ? Je suis à l'aide de Printemps 4.0.1.. je suis nouveau sur spring mvc.
- Pourquoi êtes-vous créer une nouvelle instance, en premier lieu... en gros, vous ne devez pas créer une nouvelle instance vous-même. Juste injecter le
MappingFileGenerator
. Cette construction vous utilisez en ce moment finira par conduire à de mauvaises performances, des problèmes de mémoire, problèmes transactionnels etc.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous créez une nouvelle instance d'un
ApplicationContext
(quel que soit le type) vous êtes essentiellement la création de nouvelles instances de chaque et chaque haricot configuré dans ceApplicationContext
. C'est sympa la première fois, il pourrait fonctionner de la deuxième et de la fonction de la quantité de haricots, le type de haricots crash après. Que le contexte ne sera jamais détruit (jusqu'à ce que l'application de s'écraser et de redémarrage) vous permettra de courir sur de possibles problèmes de mémoire, des problèmes de performances, d'étranges problèmes transactionnels etc.Une règle générale est de jamais la construction d'une nouvelle instance d'un
ApplicationContext
mais à utiliser l'injection de dépendance à la place.Si vous voulez vraiment accès à la
ApplicationContext
mettre un champ de ce type dans votre contrôleur et de mettre@Autowired
sur elle.Ensuite, vous pouvez faire une recherche pour le haricot dont vous avez besoin dans la méthode. Cela peut être pratique si vous utilisez le
ApplicationContext
comme une usine pour vos haricots. Si tous les haricots que vous avez besoin sont des singletons, il est préférable de simplement injecter le haricot dont vous avez besoin.Maintenant, le Printemps va injecter la
MappingFileGenerator
et il est disponible pour une utilisation dans vos méthodes. Pas besoin de créer une nouvelle instance d'unApplicationContext
.Plus d'informations dans les Le Printemps Du Guide De Référence.
new ApplicationContext
pourrait être une exagération? Printemps exemples de faire cela dans unmain()
méthode.@M. Deinum commentaire obtiendrez tout à fait un peu plus upvotes.
Penser à créer un
new ApplicationContext
comme l'instanciation d'une nouvelle instance d'une application. Voulez-vous faire que chaque fois que cela (ou toute autre méthode dans ladite demande) est appelé? Non, vous ne le font pas.Je devine que vous pense que vous faites parce que vous avez besoin d'accéder à votre
ApplicationContext
dans cette méthode. Pour ce faire, c'est à dire l'accès à la de course contexte d'application (plutôt que d'en créer un nouveau), vous voulez faireLa clé ici est la
Autocâblés
annotation, qui dit Printemps à injecter l'objet en tant que la dépendance.Je vous suggère fortement suivant les liens que j'ai compris (pour les débutants), comme ce que vous faites ici suggère assez fortement que vous n'avez pas enroulé autour de votre tête ce que DI est et fait pour vous, et vous ne le faites pas, il est susceptible d'être contre-productif vers sa propre fin pour vous.
Dans le cas où il aide quelqu'un, j'ai eu ce problème sur un nouveau Mappage d'URL ajouté à un projet gradle, j'ai été absent de la première barre de l'url et que l'origine de ce "illegalstate actualisée pas encore" sur mes tests