Je suis assez nouveau dans Spring Framework, j'ai joué avec lui et assemblé quelques exemples d'applications dans le but d'évaluer Spring MVC pour une utilisation dans un projet d'entreprise à venir. Jusqu'à présent, j'aime vraiment ce que je vois dans Spring MVC, semble très facile à utiliser et vous encourage à écrire des classes qui sont très faciles à tester.
Juste comme exercice, j'écris une méthode principale pour l'un de mes projets d'échantillons / tests. Une chose dont je ne suis pas certain, c'est les différences exactes entre BeanFactory
et ApplicationContext
- ce qui est approprié à utiliser dans quelles conditions?
Je comprends que cela ApplicationContext
s'étend BeanFactory
, mais si j'écris simplement une méthode principale simple, ai-je besoin de la fonctionnalité supplémentaire ApplicationContext
fournie? Et quel type de fonctionnalité supplémentaire ApplicationContext
offre exactement ?
En plus de répondre "qui dois-je utiliser dans une méthode main ()", existe-t-il des normes ou des directives concernant l'implémentation à utiliser dans un tel scénario? Est-ce que ma méthode main () doit être écrite pour dépendre de la configuration du bean / application au format XML - est-ce une hypothèse sûre, ou suis-je en train de verrouiller l'utilisateur dans quelque chose de spécifique?
Et cette réponse change-t-elle dans un environnement Web - si l'une de mes classes devait connaître Spring, est-elle plus susceptible d'en avoir besoin ApplicationContext
?
Merci pour toute aide. Je sais que beaucoup de ces questions trouvent probablement une réponse dans le manuel de référence, mais j'ai du mal à trouver une ventilation claire de ces deux interfaces et les avantages / inconvénients de chacune sans lire le manuel avec un peigne à dents fines.
BeanFactory
nous pouvons passer des paramètres constructeurs dynamiquement mais avecApplicationContext
nous nous ne pouvons pas le faire.FileSystemXmlApplicationContext
Haricots chargés à travers le chemin complet.ClassPathXmlApplicationContext
Haricots chargés via le CLASSPATHXMLWebApplicationContext
et lesAnnotationConfigWebApplicationContext
beans chargés via le contexte de l'application Web.AnnotationConfigApplicationContext
Chargement des beans Spring à partir d'une configuration basée sur des annotations.exemple:
ApplicationContext
est le conteneur initialisé par aContextLoaderListener
ouContextLoaderServlet
défini dans aweb.xml
etContextLoaderPlugin
défini dansstruts-config.xml
.Remarque :
XmlBeanFactory
est déconseillé à partir du printemps 3.1 en faveur deDefaultListableBeanFactory
etXmlBeanDefinitionReader
.la source
Pour moi, la principale différence de choisir
BeanFactory
plusApplicationContext
semble être queApplicationContext
sera pré-instancier tous les haricots. À partir des documents du printemps :Compte tenu de cela, j'ai d'abord choisi
BeanFactory
d'utiliser les tests d'intégration / de performance car je ne voulais pas charger l'application entière pour tester les beans isolés. Cependant - et quelqu'un me corrige si je me trompe -BeanFactory
ne prend pas en charge laclasspath
configuration XML. Donc,BeanFactory
etApplicationContext
chacun fournit une fonctionnalité cruciale que je voulais, mais les deux non plus.Autant que je sache, la note dans la documentation sur le remplacement du comportement d'instanciation par défaut a lieu dans la configuration, et c'est par bean, donc je ne peux pas simplement définir l'attribut "lazy-init" dans le fichier XML ou je suis bloqué en conservant une version pour le test et une pour le déploiement.
Ce que j'ai fini par faire était d'étendre le
ClassPathXmlApplicationContext
chargement de haricots paresseux à utiliser dans des tests comme celui-ci:la source
BeanFactory doesn't support classpath XML configuration.
Je pense que ouiPour ajouter à ce que Miguel Ping a répondu, voici une autre section de la documentation qui y répond également:
(poster ceci pour tous les futurs novices du printemps qui pourraient lire cette question)
la source
ApplicationContext
est plus préférable queBeanFactory
Dans les nouvelles versions Spring
BeanFactory
est remplacé parApplicationContext
. MaisBeanFactory
existe toujours pour la compatibilité descendanteApplicationContext extends BeanFactory
et présente les avantages suivantsla source
ApplicationContext: Il charge les beans Spring configurés dans le fichier de configuration Spring et gère le cycle de vie du Spring Bean au fur et à mesure du démarrage du conteneur. Il n'attendra pas que getBean ("springbeanref") soit appelé.
BeanFactory Il charge beans printemps configurés dans le fichier de configuration du ressort, gère le cycle de vie de la fève de printemps , quand nous appelons le getBean ( « springbeanref ») .Donc lorsque nous appelons le getBean ( « springbeanref ») au moment de cycle de vie de haricots printemps commence .
la source
Je pense qu'il est préférable de toujours utiliser ApplicationContext, sauf si vous êtes dans un environnement mobile comme quelqu'un l'a déjà dit. ApplicationContext a plus de fonctionnalités et vous voulez certainement utiliser les PostProcessors tels que RequiredAnnotationBeanPostProcessor, AutowiredAnnotationBeanPostProcessor et CommonAnnotationBeanPostProcessor, qui vous aideront à simplifier vos fichiers de configuration Spring, et vous pouvez utiliser des annotations telles que @Required, @PostConstruct, @Resource, etc. .
Même si vous n'utilisez pas tout ce que propose ApplicationContext, il est préférable de l'utiliser de toute façon, puis plus tard si vous décidez d'utiliser des ressources telles que des messages ou des post-processeurs, ou l'autre schéma pour ajouter des conseils transactionnels et autres, vous aura déjà un ApplicationContext et n'aura pas besoin de changer de code.
Si vous écrivez une application autonome, chargez ApplicationContext dans votre méthode principale, à l'aide d'un ClassPathXmlApplicationContext, et obtenez le bean principal et appelez son run () (ou toute autre méthode) pour démarrer votre application. Si vous écrivez une application Web, utilisez le ContextLoaderListener dans web.xml afin qu'il crée l'ApplicationContext et que vous puissiez ensuite l'obtenir à partir du ServletContext, que vous utilisiez JSP, JSF, JSTL, Struts, Tapestry, etc. .
Rappelez-vous également que vous pouvez utiliser plusieurs fichiers de configuration Spring et vous pouvez soit créer ApplicationContext en répertoriant tous les fichiers dans le constructeur (ou en les répertoriant dans le paramètre de contexte pour ContextLoaderListener), ou vous pouvez simplement charger un fichier de configuration principal qui a déclarations d'importation. Vous pouvez importer un fichier de configuration Spring dans un autre fichier de configuration Spring en utilisant <import resource = "otherfile.xml" />, ce qui est très utile lorsque vous créez par programmation ApplicationContext dans la méthode principale et chargez un seul fichier de configuration Spring.
la source
Pour la plupart, ApplicationContext est préférable, sauf si vous devez enregistrer des ressources, comme sur une application mobile.
Je ne suis pas sûr de dépendre du format XML, mais je suis presque sûr que les implémentations les plus courantes d'ApplicationContext sont celles XML telles que ClassPathXmlApplicationContext, XmlWebApplicationContext et FileSystemXmlApplicationContext. Ce sont les trois seuls que j'ai jamais utilisés.
Si vous développez une application Web, il est sûr de dire que vous devrez utiliser XmlWebApplicationContext.
Si vous souhaitez que vos beans soient au courant de Spring, vous pouvez les faire implémenter BeanFactoryAware et / ou ApplicationContextAware pour cela, vous pouvez donc utiliser BeanFactory ou ApplicationContext et choisir l'interface à implémenter.
la source
ApplicationContext
inclut toutes les fonctionnalités de l 'BeanFactory
, il est généralement recommandé de l' utiliser de préférence auBeanFactory
, sauf pour quelques situations limitées comme dans unApplet
, où la consommation de mémoire peut être critique et quelques kilo - octets supplémentaires faites une différence. Cependant, pour la plupart des applications et systèmes d'entreprise «typiques»,ApplicationContext
c'est ce que vous voudrez utiliser.Les différences entre BeanFactory et ApplicationContext sont les suivantes:
Utilisation de BeanFactory:
Utilisation d'ApplicationContext:
la source
BeanFactory et ApplicationContext sont tous deux des moyens d'obtenir des haricots à partir de votre conteneur IOC de printemps , mais il existe toujours des différences.
BeanFactory est le conteneur réel qui instancie, configure et gère un certain nombre de beans. Ces beans collaborent généralement entre eux et ont donc des dépendances entre eux. Ces dépendances se reflètent dans les données de configuration utilisées par BeanFactory.
BeanFactory et ApplicationContext sont tous deux des interfaces Java et ApplicationContext étend BeanFactory. Les deux sont configurés à l'aide de fichiers de configuration XML. En bref, BeanFactory fournit des fonctionnalités basiques d'inversion de contrôle ( IoC ) et d'injection de dépendance ( DI ) tandis qu'ApplicationContext fournit des fonctionnalités avancées .
Une BeanFactory est représentée par l'interface " org.springframework.beans.factory " où BeanFactory, pour laquelle il existe plusieurs implémentations.
DIFFÉRENCE
BeanFactory instancie le bean lorsque vous appelez la méthode getBean () tandis que ApplicationContext instancie le bean Singleton lorsque le conteneur est démarré, il n'attend pas que getBean () soit appelé.
BeanFactory ne fournit pas de support pour l'internationalisation mais ApplicationContext le fournit.
Une autre différence entre BeanFactory et ApplicationContext est la possibilité de publier un événement sur des beans enregistrés comme écouteur.
XMLBeanFactory est l'une des implémentations populaires de l' interface BeanFactory, tandis que l'une des implémentations populaires de l' interface ApplicationContext est ClassPathXmlApplicationContext .
Si vous utilisez le câblage automatique et utilisez BeanFactory, vous devez enregistrer AutoWiredBeanPostProcessor à l' aide de l'API que vous pouvez configurer en XML si vous utilisez ApplicationContext . En résumé, BeanFactory est OK pour les tests et l'utilisation hors production, mais ApplicationContext est une implémentation de conteneur plus riche en fonctionnalités et doit être privilégiée par rapport à BeanFactory
BeanFactory supporte par défaut son chargement paresseux et ApplicationContext supporte par défaut un chargement agressif .
la source
Matrice des fonctionnalités de Bean Factory vs contexte d'application provenant de documents de printemps
Capture d'écran des fonctionnalités de BeanFacotry et ApplicationContext
la source
une. Une différence entre la fabrique de bean et le contexte d'application est que l'ancien bean instancie uniquement lorsque vous appelez la méthode getBean () tandis que ApplicationContext instancie le bean Singleton lorsque le conteneur est démarré.Il n'attend pas que getBean soit appelé.
b.
ou
Vous pouvez utiliser un ou plusieurs fichiers xml en fonction des besoins de votre projet. Comme j'utilise ici deux fichiers xml, c'est-à-dire un pour les détails de configuration des classes de service, l'autre pour les classes dao. Ici, ClassPathXmlApplicationContext est enfant d'ApplicationContext.
c. BeanFactory Container est un conteneur de base, il ne peut que créer des objets et injecter des dépendances. Mais nous ne pouvons pas attacher d'autres services comme la sécurité, les transactions, la messagerie, etc. pour fournir tous les services dont nous disposons pour utiliser ApplicationContext Container.
ré. BeanFactory ne prend pas en charge l'internationalisation, c'est-à-dire i18n, mais ApplicationContext le prend en charge.
e. BeanFactory Container ne prend pas en charge la fonctionnalité d'AutoScanning (Support Annotation based dependency Injection), mais ApplicationContext Container prend en charge.
F. Beanfactory Container ne créera pas d'objet bean avant l'heure de la demande. Cela signifie que Beanfactory Container charge les grains paresseusement. Alors que ApplicationContext Container crée des objets de bean singleton au moment du chargement uniquement. Cela signifie qu'il y a un chargement précoce.
g. Beanfactory Container ne prend en charge que deux portées (singleton et prototype) des beans. Mais ApplicationContext Container prend en charge toute la portée des beans.
la source
Fondamentalement, nous pouvons créer un objet conteneur à ressort de deux façons
les deux sont les interfaces,
en utilisant des classes d'implémentation, nous pouvons créer un objet pour le conteneur à ressort
venir aux différences
BeanFactory:
Ne prend pas en charge l'injection de dépendances basée sur les annotations.
Ne prend pas en charge I18N.
Par défaut, il prend en charge le chargement paresseux.
il ne permet pas de configurer plusieurs fichiers de configuration.
ex: contexte BeanFactory = nouveau XmlBeanFactory (nouvelle ressource ("applicationContext.xml"));
ApplicationContext
Prise en charge de la dépendance basée sur les annotations Injection.-@Autowired, @PreDestroy
Prise en charge I18N
Par défaut, il prend en charge le chargement agressif.
Il permet de configurer plusieurs fichiers de configuration.
ex:
contexte ApplicationContext = nouveau ClasspathXmlApplicationContext ("applicationContext.xml");
la source
Reportez-vous à ce document de Spring Docs:
http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#context-introduction-ctx-vs-beanfactory
5.15.1 BeanFactory ou ApplicationContext?
Utilisez un ApplicationContext sauf si vous avez une bonne raison de ne pas le faire.
Étant donné que ApplicationContext inclut toutes les fonctionnalités de BeanFactory, il est généralement recommandé par rapport à BeanFactory, à l'exception de quelques situations comme dans une applet où la consommation de mémoire peut être critique et quelques kilo-octets supplémentaires peuvent faire la différence. Cependant, pour la plupart des applications et systèmes d'entreprise typiques, ApplicationContext est ce que vous voudrez utiliser. Spring 2.0 et versions ultérieures font un usage intensif du point d'extension BeanPostProcessor (pour effectuer un proxy et ainsi de suite). Si vous utilisez uniquement un BeanFactory ordinaire, une bonne quantité de support, comme les transactions et l'AOP, ne prendra pas effet, du moins pas sans quelques étapes supplémentaires de votre part. Cette situation pourrait être déroutante car rien n'est réellement mauvais avec la configuration.
la source
ApplicationContext est un grand frère de BeanFactory et tout cela serait fourni par BeanFactory et bien d'autres choses.
Outre les capacités de cycle de vie org.springframework.beans.factory.BeanFactory standard, les implémentations ApplicationContext détectent et appellent les beans ApplicationContextAware ainsi que les beans ResourceLoaderAware, ApplicationEventPublisherAware et MessageSourceAware.
la source
Dans un scénario en temps réel, la différence entre le conteneur Spring IOC Core (BeanFactory) et le conteneur Advanced J2EE (ApplicationContext) est la suivante.
BeanFactory créera des objets pour les beans (c'est-à-dire pour les classes POJO) mentionnés dans le fichier spring.xml (
<bean></bean>
) uniquement lorsque vous appelez la méthode .getBean (), mais alors que ApplicationContext crée les objets pour tous les beans (<bean></bean>
si sa portée n'est pas explicitement mentionné comme "Prototype") configuré dans le fichier spring.xml lors du chargement du fichier spring.xml lui-même.BeanFactory: (conteneur paresseux car il crée les objets pour les beans uniquement lorsque vous appelez explicitement à partir de la classe user / main)
ApplicationContext: (conteneur désireux en raison de la création des objets de tous les beans singleton lors du chargement du fichier spring.xml lui-même)
Techniquement, l'utilisation d'ApplicationContext est recommandée car dans les applications en temps réel, les objets bean seront créés pendant le démarrage de l'application sur le serveur lui-même. Cela réduit le temps de réponse à la demande de l'utilisateur car les objets sont déjà disponibles pour répondre.
la source
Je pense qu'il convient de mentionner que depuis le printemps 3, si vous voulez créer une usine, vous pouvez également utiliser l'
@configuration
annotation combinée avec la bonne@scope
Votre usine doit être visible par le conteneur Spring en utilisant l'
@ComponentScan
annotation ou la configuration xmlArticle sur les haricots de printemps du site de Baeldung
la source
utilisez BeanFactory pour les applications non Web car il ne prend en charge que les étendues de bean Singleton et Prototype.
Alors que le conteneur ApplicationContext prend en charge toutes les étendues de bean, vous devez donc l'utiliser pour des applications Web.
la source
En résumé:
Le ApplicationContext inclut toutes les fonctionnalités du BeanFactory. Il est généralement recommandé d'utiliser le premier.
Il existe certaines situations limitées, comme dans une application mobile, où la consommation de mémoire peut être critique.
Dans ces scénarios, il peut être justifié d'utiliser le BeanFactory plus léger . Cependant, dans la plupart des applications d'entreprise, ApplicationContext est ce que vous voudrez utiliser.
Pour en savoir plus, consultez mon article de blog:
Différence entre BeanFactory et ApplicationContext in Spring - Le blog du printemps java des bases
la source
J'ai besoin d'expliquer le BeanFactory & ApplicationContext.
BeanFactory: BeanFactory est l'interface racine pour accéder au conteneur SpringBean. Il existe une vue client de base d'un conteneur de bean. Cette interface est implémentée par la classe d'objets qui contient le nombre de définitions de beans, et chacune est identifiée de manière unique par le nom de chaîne.
En fonction de la définition du bean, la fabrique renvoie l'instance, cette instance peut être l'instance de l'objet contenu ou une seule instance partagée. Le type d'instance qui sera renvoyé dépend de la configuration de l'usine de bean.
Normalement, Bean Factory chargera la définition de tous les beans, qui est stockée dans la source de configuration comme XML ... etc.
BeanFactory est un conteneur le plus simple fournissant le support de base pour l'injection de dépendance
Contexte d' application Le contexte d'application est une interface centrale avec dans l'application Spring qui fournit les informations de configuration à l'application. Il implémente l'interface Bean Factory.
Le contexte d'application est un conteneur avancé qui ajoute un niveau avancé de fonctionnalités spécifiques à l'entreprise telles que la capacité de résoudre le message textuel à partir du fichier de propriétés, etc., etc.
Un ApplicationContext fournit:
Méthodes Bean Factory pour accéder aux composants de l'application. Hérité de ListableBeanFactory. La possibilité de charger des ressources de fichiers de manière générique. Hérité de l'interface ResourceLoader. La possibilité de publier des événements pour les auditeurs enregistrés. Hérité de l'interface ApplicationEventPublisher. La capacité de résoudre des messages, de soutenir l'internationalisation. Hérité de l'interface MessageSource. Héritage d'un contexte parent. Les définitions dans un contexte descendant seront toujours prioritaires. Cela signifie, par exemple, qu'un seul contexte parent peut être utilisé par une application Web entière, tandis que chaque servlet a son propre contexte enfant qui est indépendant de celui de tout autre servlet. En plus des capacités de cycle de vie standard de BeanFactory,
la source