Lorsque nous travaillons sur un projet, nous utiliserons un auditeur pour obtenir des fichiers de configuration de ressort, puis éliminerons les haricots dont nous avons besoin. Par exemple, pour créer la page d'accueil du site Web. En supposant que la logique commerciale de fond du produit est bien fait, nous devons créer un auditeur et interroger les données de page d'accueil au démarrage du projet et les mettre dans l'application, c'est-à-dire la méthode d'appel de la logique commerciale du produit d'arrière-plan dans l'auditeur, c'est-à-dire, nous devons obtenir les grains correspondants configurés à Spring dans l'auditeur. Créez d'abord l'auditeur:
1. Créez un initdatalisERner
Créer un écouteur InitDatalistener hérite de servletContextListener:
/ ** * @Description: TODO (Utilisé pour initialiser les données lorsque le projet démarre) * @author eson_15 * * / // @ composant // écouteur est un composant de la couche Web. Il est instancié par Tomcat, non instancié par le printemps. Impossible d'être placé dans la classe publique printemps initDatalistener implémente ServletContexListener {private productService producceService = null; // ProductService définit la logique commerciale liée au produit @Override public void contextDestroyed (ServletContexTevent Event) {} @Override public void contextinitial (ServLetConTexTevent Event) {}}Et configurez l'auditeur dans web.xml:
Comme mentionné ci-dessus, une logique commerciale du produit est définie dans le ProductService, et cette serviette de produits est remise au printemps pour la direction. Alors, comment pouvons-nous obtenir cet objet? La première chose à être sûre est que nous ne pouvons pas le sortir par nous-mêmes, car s'il sort, cela n'a rien à voir avec le CIO de Spring… il existe trois façons principales de l'atteindre. Nous l'analysons un par un et comparons enfin les avantages et les inconvénients.
2. Chargez directement le fichier bean.xml
Cette méthode est simple et brute. Vous n'avez pas besoin de charger le fichier de configuration? Ok, je vais le charger, comme suit:
// @ composant // L'auditeur est un composant de la couche Web. Il est instancié par Tomcat, pas le printemps. Impossible de placer dans la classe publique de printemps initDatalistener implémente servletContextListener {Private ProductService ProductService = NULL; // ProductService définit la logique commerciale liée au produit @Override public void contextDestRoyed (ServletContexTevent Event) {} @Override public void contextinitialialialized (servletContextevent Event) {// Get the Business Logic Class Class ProduceService Product Information Context; ProductService = (ProductService) context.getBean ("ProductService"); System.out.println (ProductService); // Sortie pour voir si vous l'obtenez // Ce qui suit est les opérations spécifiques liées aux services de produits ...}}Cette méthode est tout à fait correcte et l'idée est très claire. Chargez d'abord le fichier de configuration bean.xml, puis obtenez le bean. Cependant, après avoir commencé Tomcat, jetons un coup d'œil à la sortie des informations de la console:
À ce stade, nous devons trouver les inconvénients de cette méthode. Les fichiers de configuration ont été chargés deux fois, ce qui signifie que ces haricots ont été instanciés deux fois. À en juger par les informations imprimées, nous avons obtenu les haricots que nous avons chargé les fichiers de configuration nous-mêmes et que nous avons été instanciés. Cette méthode est évidemment indésirable.
3. Get de ServletContext
D'après la méthode ci-dessus, nous pouvons au moins savoir que Spring a chargé le fichier de configuration une fois via son écouteur. Nous n'avons pas besoin de le charger à nouveau. Il est facile de penser que si nous savons où Spring a été chargé, nous pouvons obtenir le fichier de configuration à partir de là. Jetons un coup d'œil au processus de chargement du fichier de configuration au printemps:
Dans la figure ci-dessus (le code non pertinent est omis), le ContextloaderListener est l'écouteur Spring que nous avons configuré dans web.xml. Il implémente également le servletContextListener et hérite du contexte. Dans l'auditeur, le fichier de configuration est principalement obtenu via la méthode initWebApplicationContext et créent un objet WebApplicationContext. Dans la méthode initWebApplicationContext, deux choses principales sont faites: l'une consiste à obtenir le contexte de printemps, et l'autre est de mettre le contexte de printemps dans le servletContext, et la clé est: webapplicationcontext.root_web_application_context_attribute. Alors, comment obtenez-vous le contexte du printemps? Il s'agit d'obtenir le chemin du Spring configuré dans web.xml. Config_Location_Parm est en fait une constante de chaîne, qui est l'écouteur Spring configuré suivant dans web.xml:
<Touxet-Param> <Am param-name> ContextConfiglocation </ Param-Name> <! - Config_Location_Parm est contextConfiglocation -> <Ar param-Value> CLASSPATH: beans.xml </ param-valeur> </ context-param>
Il est donc évident que vous obtenez des bean.xml via le chemin configuré dans web.xml, puis chargez ce fichier de configuration et instanciez le bean.
Maintenant que nous savons qu'après que Spring charge le fichier de configuration et le met dans le servletContext, nous pouvons aller ici et l'obtenir directement!
// @ composant // L'auditeur est un composant de la couche Web. Il est instancié par Tomcat, pas le printemps. Impossible de placer dans la classe publique de printemps initDatalistener implémente servletContextListener {Private ProductService ProductService = NULL; @Override public void contextDestRoyed (ServletContexTevent Event) {// TODO Méthode générée automatiquement Stub} @Override public void contextinitialialialialialized (ServletContexTevent Event) {// Obtenir les informations sur le produit de la classe de la logique Business Spring // Solution 2: lorsque le projet est démarré, le fichier de configuration de printemps est chargé par l'écouteur de printemps et stocké dans le service de serviette. Nous avons juste besoin de l'obtenir dans le servletContext. ApplicationContext context = (applicationContext) event.getServletContext () .getAttribute (webApplicationContext.root_web_application_context_attribute); ProductService = (ProductService) context.getBean ("ProductService"); System.out.println (ProductService); }} De cette façon, nous pouvons obtenir l'objet instancié de la restauration. Cette méthode est bonne, mais les paramètres du getAttribute sont trop longs. Je ne sais pas si le front du programmeur a été coupé à ce moment-là. Je suppose qu'il ne pouvait pas penser à d'autres noms plus appropriés ~
4. Chargement via la classe d'outils fournie par Spring <br /> Peut-être que les gros gars qui ont développé Spring ont également réalisé que le nom de ce paramètre était trop long, ils ont donc fourni une classe de méthode qui peut charger le fichier de configuration:
classe publique InitDatalistener implémente ServletContextListener {Private ProductService ProductService = NULL; @Override public void contextDestRoyed (ServletContexTevent Event) {// Todo Method-Generated Method Stub} @Override public void contextinitialialialized (ServletContexTevent Event) {// Get Business Logic Class Query Product Informations WebApplicationContext contextServletConText ProductService = (ProductService) context.getBean ("ProductService"); System.out.println (ProductService); }} En fait, la méthode GetWebApplicationContext ici encapsule la méthode ci-dessus. Regardons le code source de cette méthode:
public statique webApplicationContext getWebApplicationContext (ServletContext sc) {return getWebApplicationContext (sc, webapplicationcontext.root_web_application_context_attribute); }Ceci est plus pratique pour les programmeurs, c'est tout ... donc nous utilisons généralement la troisième méthode pour obtenir le fichier de configuration de Spring, obtenant ainsi le bean instancié correspondant.
Lien original: http://blog.csdn.net/eson_15/article/details/51373937
Ce qui précède est la solution au crash de l'iPhone 6Splus Wechat. J'espère que ce sera utile à tout le monde. J'espère également que tout le monde soutiendra Wulin.com et accordera plus d'attention à un contenu plus excitant sur wulin.com.