Struts2.3.24 + printemps4.1.6 + Hibernate4.3.11 + MySQL5.5.5.25 Construction de l'environnement de développement et instructions connexes.
1. Objectif
1. Construisez un environnement de développement SSH traditionnel et exécutez-le avec succès (insérer, requête)
2. Comprendre la configuration du pool de connexion C3P0
3. Comprendre le cache secondaire de l'hibernate et vérifier
4. Comprendre la configuration des choses à ressort et vérifier
5. Comprendre le CIO de Spring (injection de dépendance), remettre l'objet d'action (haricot) de Struts2 à la gestion du printemps, des haricots personnalisés, etc., et vérifiez
6. Comprendre Spring AOP (programmation orientée section) et écrire des fonctions de section personnalisées pour vérifier les résultats
2. Préparation
Environnement de développement: Eclipse pour Java EE; MySQL5.5.25; JDK1.7.0_79; NAVICAT10.1.7 (facultatif);
Créer une démonstration de base de données:
/ * NAVICAT MYSQL DATA TRANSFERSOURCE Server: LocalHost_3306Source Server Version: 50519Source Hôte: LocalHost: 3306Source Database: Demotarget Server Type: MySQLtarget Server Version: 50519File Encoding: 65001Date: 2016-01-09 23: 36: 02 * / set Afrittement ------------------------------ STRUCTURE DE TABLE pour `User`-- -------------------------------- Déposez la table si existe` `User`; Créer la table« User »(` id` bigint (20) pas null auto_increment, `compty» varchar (200) pas null, `name» varchar (200) pas null » CharSet = utf8;
Créer un nouveau projet Web, la structure du répertoire est la suivante:
Préparez le package JAR et mettez-le dans le répertoire de LIB Web (si vous êtes intéressé, vous pouvez utiliser Maven pour gérer le processus, mais parfois il est très lent à télécharger le package JAR ...)
Les forfaits de pot connexes peuvent être trouvés dans les jambes de force téléchargées, le printemps et l'hibernate. Voici une référence. Certains d'entre eux peuvent être supprimés, tels que les packages en pot dans la pièce Spring MVC:
3. Configurer web.xml
Configurez un filtre Struts2 pour cartographier toutes les demandes de *.
Configurez le paramètre contextuel-param et spécifiez le chemin d'accès du fichier de configuration de ressort. Les paramètres dans <context-param> peuvent être obtenus en utilisant servletContext.getInitParameter ("param-name");
La configuration de l'auditeur consiste principalement à lire les informations sur le fichier de configuration ApplicationContext.xml, à créer des fèves et d'autres travaux d'initialisation;
<? xml version = "1.0" Encoding = "utf-8"?> <web-app xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" XSI: ScheMalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "webapp_id =" 3.0 " <splay-name> ssh </ display-name> <filter> <filter-name> struts2 </filter-name> <filter-Class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter </ filter-Class> </ filter> <filter> <filter-name> Struts2 </ Filter> <filter> <filter-name> Struts2 </ Filter> <filter> <filter-name> <URL-Pattern> *. Action </ url-Pattern> </ Filter-Mapping> <Touxet-Param> <AmArd-Name> ContextConfiglocation </ Param-Name> <Amvin-Value> ClassPath: ApplicationContext.xml </ Param-valeur> <écouteur-classe> org.springframework.web.context.contextLoaderListener </ auteur-class> </diner> <welcome-file-list> <leen welcome> index.jsp </ bienvenue-file> </ bienvenue-file-list> </ web-app>
4. Configurer l'applicationcontext.xml
Configurer la numérisation automatique de @Repostory, @Service et d'autres annotations sous le package SSH et générer des haricots correspondants;
Configurer la source de données (JDBC Connection Pool est C3P0, vous pouvez vous référer à la configuration détaillée de C3P0). La fonction principale du pool de connexion est de fournir rapidement la connexion et de la réutiliser. Il ne nécessite pas chaque destruction et chaque création. Il nécessite une configuration du nom d'utilisateur, du mot de passe, du nombre maximum de connexions, du nombre minimum de connexions, du nombre initial de connexions et d'autres paramètres connexes;
Configurer SessionFactory (vous pouvez vous référer à la configuration détaillée de HiberNate, où vous configurez pour activer le cache de niveau 2), la fonction principale est de fournir des session et d'exécuter des instructions SQL; Ici, nous utiliserons HiberNateTemplate pour faire fonctionner la base de données pour faciliter le contrôle physique du printemps; PS, le mappage entre les classes et les tables de base de données doit également être configuré dans la configuration Hibernate;
Configurez le Bean du gestionnaire de transaction en tant que HiberNateTransActionManager et initialisez l'attribut de membre SessionFactory à SessionFactory Bean configuré précédemment;
Configurez les caractéristiques de propagation de la transaction et configurez une section pour y faire référence et effectuez le contrôle de la transaction de toutes les méthodes Ajouter, supprimer, mettre à jour et enregistrer dans tous les packages et sous-packages SSH. Vous pouvez également configurer le comportement de propagation des transactions et d'autres paramètres;
Enfin, il existe une configuration liée à AOP personnalisée, qui applique la section personnalisée «MyAop» pour contrôler toutes les méthodes à partir des tests sous SSH.AOP.AOPTEST, et les résultats seront vérifiés plus tard;
<? xml version = "1.0" Encoding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: xsi = "http://www.w3.org/2001/xmlma. xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: jdbc = "http://www.springframework.org/schema/jdbc" xsi: schemalocation = "http://www.springfrrame http://www.springframework.org/schema/beans http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsdd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsddd http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <! - scanne le ClassPath pour les composants annotés (y compris @Repostory et @Service qui seront auto-registres en tant que Spring Beans -> <Context: Component-Scan-Package =" SSH "/> <! name = "dataSource" destrement-méthod = "close"> <propriété name = "driverclass" value = "com.mysql.jdbc.driver" /> <propriété name = "jdbcurl" value = "jdbc: mysql: // localhost: 3306 / démo" /> <propriété name = "user" value = "root" /> name = "AcquireIncrement" value = "1"> </ propriété> <propriété name = "initialPoolSize" value = "80"> </ propriété> <propriété name = "maxidletime" value = "60"> </ propriété> <propriété name = "maxpoolSize" value = "80"> </ / propriété name = "minfolSize" value = "30"> </ / propriété Name = "acquireserDDELSIZE" Value = "30"> Value = "1000"> </ propriété> <propriété name = "acquerreetAtTempts" value = "60"> </ propriété> <propriété name = "BreakfteracQuireFailure" value = "false"> </ propriété> <! - Si trop de connexions apparaissent, veuillez noter que si vous modifiez le fichier de configuration My.ini de MySQL pour augmenter le nombre maximum de connexions (voir la commande de connexion actuelle: WAVER COMPRE id = "sessionfactory"> <propriété name = "dataSource" ref = "dataSource" /> <propriété name = "hibernateproperties"> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </ prop> <prop> <ple key = "hibernate.hbm2ddl.auto"> update </ prop> <prop key = "current_session_context_class"> thread </ prop> <prop key = "hibernate.cache.use_second_level_cache"> true ^ prop> <prop.> "HiberNate.cache.use_second_level_cache"> tr> <pree key = "hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.ehcacheRegionfactory </prop> <prop Key = "hibernate.cache.use_query_cache"> true </ prop> < key = "hibernate.cache.provider_configuration_file_resource_path"> ehcache.xml </ prop> </prop> </ props> </ propriété> <propriété name = "mappingLocations"> <sist> <value> classpath: ssh / model / user.hbm.xml </value> </sist> </prewetfot name = "AnnotatedClasses"> <swing> <value> ssh.model.user </value> </sist> </ propriété> -> </ank> <! - Configurer les transactions gestionnaires -> <bean id = "TransactionManager"> <propriété Name = "SessionFactory" Ref = "SessionFactory" /> </an> <! - Caractéristiques de propagation de Transaction-Managère = "TransactionManager"> <Tx: Attribuez> Attribuement> Attribuement> Attribuement> Transaction-Managère = "TransactionManAr" <tx: méthode name = "add *" propagation = "requise" read-only = "false" rollback-for = "java.lang.exception" /> <tx: méthode name = "delete *" propagation = "requise" readly = "false" rollback-for = "java.lang.exception" /> <tx: méthode name = "update *" propagation = "requis" requise " rollback-for = "java.lang.exception" /> <tx: méthode name = "sauver *" propagation = "requise" read-only = "false" rollback-for = "java.lang.exception" /> </ tx: attributes> </ tx: conseils> <aop: config> <aop: pointcut id = "pcMethod" expression = "exécution (* * * * * * * exécution (*; * ssh.service..*.*(..))" /> <aop:advisor pointcut-ref="pcMethod" advice-ref="txadvice" /> </aop:config> <!-- Custom aop processing test--> <bean id="aopTest"></bean> <bean id="myAop"></bean> <aop:config proxy-target-class="true"> <aop: aspect ref = "myaop"> <aop: Pointcut id = "pcMethodTest" expression = "exécution (* ssh.aop.aoptest.test * (..))" /> <aop: avant Pointcut-ref = "pcMethodTest" méthode = "avant" /> <aop: after Pointcut-ref = "pcMethodT" </aop: aspect> </ aop: config> </bans>
5. Configurer les struts.xml
Configurez les structures.ObjectFactory Constante au ressort, indiquant que l'action est obtenue par le haricot à ressort;
Configurez le type de résultat pour "JSON", et vous pouvez également configurer d'autres choses. Ici, pour la commodité de l'interaction des données frontale et back-end, il est configuré au format JSON;
Configurez deux actions, AddUser et QueryAllUser;
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Struts Public "- // APache Software Foundation // Dtd Struts Configuration 2.3 // en" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constante nom = "StrUts.Objectfact name = "strut.enable.damicMethodInvocation" value = "false" /> <constante name = "struts.devmode" value = "false" /> <package name = "default" étend = "struts-default, json-default"> <global-results> <le résultat = "json"> <param name = "root"> json </ param> <paramor name = "contentType"> text / html </ param> </ résultat> </ global-résults> <action name = "addUser" metheth = "addUser"> <sult>. </sult> </ action> <action name = "QueryAllUser" méthode = "QueryAllUser"> <sult>. </sult> </action> </macke> <! - Add Packages ici ->.
6. Écrivez le code pertinent
Notes:
DAO hérite de la classe HiberNatedAosupport, et toutes les opérations liées à la base de données sont exploitées par HiberNateTemplate;
Ajouter des annotations correspondantes à la couche DAO, à la couche de service et à l'action, et inscrivez-vous en tant que haricots de ressort;
Le code ci-joint est le suivant:
UserAction.java
package ssh.action; import java.io.printwriter; import java.util.list; importer javax.annotation.resource; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import org.apache.log4j.logger; import; org.apache.struts2.servletActionContext; import org.springframework.sterreotype.controller; import ssh.aop.aoptest; import; Logger.getLogger (userAction.class); @Resource Private UserService UserService; @Resource Private AOPTEST AOPTEST; public void addUser () {printwriter out = null; essayez {httpServLetRequest request = servletActionContext.getRequest (); HttpServletResponse Response = servletActionContext.getResponse (); Response.SetContentType ("Text / HTML; charSet = UTF-8"); String Account = request.getParameter ("Account"); String name = request.getParameter ("name"); String Address = request.getParameter ("Address"); Utilisateur utilisateur = nouveau utilisateur (); user.setAccount (compte); user.setAddress (adresse); user.setName (nom); userService.add (utilisateur); out = réponse.getWriter (); out.write (new gson (). tojson ("succès")); } catch (exception e) {e.printStackTrace (); Logger.Error (e.getMessage ()); if (out! = null) out.write (new gson (). tojson ("échec")); } enfin {out.flush (); out.close (); }} public void queryAllUser () {printwriter out = null; aopTest.test1 (); aopTest.test2 (); //logger.error("i "); try {httpServletResponse réponse = servletActionContext.getResponse (); Response.SetContentType ("Text / HTML; charSet = UTF-8"); Gson gson = new gson (); List <ser user> userList = userService.QueryAllUser (); String gsonstr = gson.tojson (userList); out = réponse.getWriter (); out.write (Gsonstr); } catch (exception e) {e.printStackTrace (); Logger.Error (e.getMessage ()); if (out! = null) out.write (new gson (). tojson ("échec")); } enfin {out.flush (); out.close (); }}}Aoptest.java
package ssh.aop; classe publique aopTest {public void test1 () {System.out.println ("La méthode AOPTest Test1 est en cours d'exécution ~"); } public void test2 () {System.out.println ("La méthode AOPTest Test2 est en cours d'exécution ~"); }}Myaop.java
package ssh.aop; classe publique myaop {public void avant () {System.out.println ("beFor ~"); } public void after () {System.out.println ("After ~"); }}Basedao.java
package ssh.dao.base; import javax.annotation.resource; import org.hibernate.essionfactory; import org.springframework.orm.Hibernate4.support.hibernatedaosupport; public class basesao étend hibernatedaosupport {@Resource Void SetMyssse this.SetSessionFactory (SessionFactory); }}Userdao.java
Package ssh.dao; import java.util.arraylist; import java.util.list; import org.springframework.orm.hibernate4.Hibernatetemplate; import org.springframework.sterreotype.repository; import ssh.dao.base.basedao; import ssh.Model.user; @reOpositororyPublic étend basezao {public void add (utilisateur utilisateur) {this.GetHiberNateTemplate (). Save (utilisateur); } @SuppressWarnings ("Unchecked") public List <Derser> QueryAllUser () {list <utilisateur> utilisateurs = new ArrayList <User> (); HibernateTemplate hibernatetemplate = this.getHiberNateTemplate (); hibernateTemplate.setCachequeries (true); users = (list <utilisateur>) hibernatetemplate.find ("From User"); hibernateTemplate.setCachequeries (false); retourner les utilisateurs; }}User.java
package ssh.model; import java.io.serializable; public class utilisateur implémente serializable {/ ** * * / private static final SerialVersionUID = -6190571611246371934l; ID long privé; compte de chaîne privé; nom de chaîne privé; adresse de chaîne privée; Public String getAccount () {return compte; } public String getName () {Nom de retour; } public String getAddress () {return adresse; } public void setAccount (String Account) {this.account = compte; } public void setName (string name) {this.name = name; } public void setAddress (adresse de chaîne) {this.address = adresse; } / ** * @return l'ID * / public long getID () {return id; } / ** * @param id L'ID pour définir * / public void setid (long id) {this.id = id; }}User.hbm.xml
<? xml version = "1.0"?> <! - ~ Hibernate, persistance relationnelle pour les contributeurs idiomatiques Java ~ ~ Copyright (C), 2010, Red Hat Inc. ou tiers contributeurs comme ~ indiqué par les tags @Author ou l'attribut de copyright express ~ des déclarations appliquées par les auteurs. Toutes les contributions tierces sont réparties sous licence par Red Hat Inc. ~ ~ Ce matériel protégé par le droit d'auteur est mis à la disposition de toute personne souhaitant utiliser, modifier, ~ copier ou redistribuer sous réserve des termes et conditions de la licence générale du GNU ~ moindre, tel que publié par la Free Software Foundation. ~ ~ Ce programme est distribué dans l'espoir qu'il sera utile, ~ mais sans aucune garantie; Sans même la garantie implicite de qualité marchande ~ ou d'adéquation à un usage particulier. Voir la licence publique générale du GNU Leser ~ pour plus de détails. ~ ~ Vous auriez dû recevoir une copie de la licence publique générale du GNU moindre ~ avec cette distribution; Sinon, écrivez à: ~ Free Software Foundation, Inc. ~ 51 Franklin Street, Fifth Floor ~ Boston, MA 02110-1301 USA -> <! Doctype Hibernate-Mapping public "- // Hibernate / Hibernate Mapping Dtd 3.0 // en" "http://www.hibernate.org/dtd/hibernate-mapp-3.0.dtd"><Hibernate-mapp package =" ssh.model "> <class name =" user "Table =" user "> <cache usage =" read-write "/> <id name =" id "column =" id "> <générateur /> </ id> type = "java.lang.string" chronn = "compte" /> <propriété name = "name" type = "java.lang.string" chronn = "name" /> <propriété name = "adresse" type = "java.lang.string" chronmn = "adresse" /> </ class> </ hibernate-mapping>
Userservice.java
package ssh.service; import java.util.list; importer javax.annotation.resource; import org.springframework.sterreotype.service; importer ssh.dao.userdao; import ssh.model.user; @servicepublic class userservice {@Resource Pulsion userdao userdao = new userdao (); public list <serser> queryAlUser () {return userdao.QueryAlUser (); } public void add (utilisateur utilisateur) {userdao.add (utilisateur); }}index.jsp (n'oubliez pas d'ajouter la bibliothèque jQuery)
<% @ Page Language = "Java" ContentType = "Text / Html; charSet = UTF-8" Pageencoding = "UTF-8"%> <! Doctype HTML Public "- // W3C // DTD HTML 4.01 Transitional // en" "http://www.w3.org/tr/html4/loose.dtd"><html><head><meta http-equiv =" contenu-type "contenu =" text / html; charset = utf-8 "> <Title> insert le titre ici </ title> <style> .mt20 {margin-top: 20px;} </ style> </ head> <body> <div style = "text-adign: Center;"> <div> <vabed> Compte: </ label> <entrée id = "compte" type = "text" /> </ div> <v> <vabe type = "text" /> </ div> <v> <button id = "addUser"> add </ button> </div> <h3> list utilisateur: </h3> <ul id = "userList"> </ul> <script type = "text / javascrip : 'QueryAllUser.Action', Type: 'Post', DataType: 'JSON', Success: Function (Data) {try {for (var i = 0; i <data.length; i ++) {$ ("# userList"). style = 'couleur: red'> id = "+ data [i] .id +" </span>, account = "+ data [i] .account +", name = "+ data [i] .name +", adresse = "+ data [i] .address +" </li> "); }} catch (e) {}; }, erreur: fonction (e) {alert ("error sys"); }}); $("#addUser").on("click", function() { var account = $("#account").val(); var name = $("#name").val(); var address = $("#address").val(); $.ajax({ url : 'addUser.action', type : 'post', dataType : 'json', data : { account : account, name : name, address : address }, Succès: Données) {Try {$ ("# UserList"). }); }); </cript> </ body> </html>7. Résultats de la vérification
Revenez au début, commencez à vous familiariser avec les technologies pertinentes et vérifiez les résultats
1. Construisez un environnement de développement SSH traditionnel et exécutez-le avec succès (insérer, requête)
La figure suivante: interrogez et ajoutez les utilisateurs avec succès;
2. Comprendre la configuration du pool de connexion C3P0
Les connexions de la base de données sont des ressources coûteuses et l'ouverture et la fermeture consomment les performances. Par conséquent, ils peuvent être gérés avec un pool de connexions, initialisant plusieurs connexions et les réutiliser, plutôt que de créer une fermeture à plusieurs reprises, ce qui est un peu similaire à un pool de fils;
La configuration est la suivante. Pour configurer raisonnablement le nombre minimum et maximum de connexions en fonction de la situation réelle du projet, veuillez vous référer au lien pour la signification détaillée de chaque paramètre.
De plus, il est très simple de vérifier la configuration du numéro de connexion. Vous pouvez écrire un programme pour le vérifier vous-même. Par exemple, lorsque le nombre maximum de connexions est de 10, vous pouvez écrire un programme pour le vérifier. Après avoir ouvert 10 connexions, la 11e connexion sera dans un état d'attente et ne peut pas être obtenue. Par conséquent, vous devez configurer le nombre de connexions raisonnablement en fonction de la situation, sinon elle peut affecter les performances de l'application;
<! - Support Data Source -> <bean name = "dataSource" destrement-méthod = "close"> <propriété name = "driverclass" value = "com.mysql.jdbc.driver" /> <propriété name = "jdbcurl" value = "jdbc: mysql: // localhost: 3306 / hot ' Value = "root" /> <propriété name = "acquireIncrement" value = "1"> </ propriété> <propriété name = "initialPoolSize" value = "80"> </ propriété> <propriété name = "maxidletime" value = "60"> </ propriété Name = "MinpoolSize" Value = "80"> </ propriété> <propriété Name = "minpools name="acquireRetryDelay" value="1000"></property> <property name="acquireRetryAttempts" value="60"></property> <property name="breakAfterAcquireFailure" value="false"></property> <!-- If Too many connections appear, please note that modify the configuration file my.ini of mysql to increase the maximum number of connections configuration items (see the current connection command: show ProcessList) -> </EAN>
3. Comprendre le cache secondaire de l'hibernate et vérifier
Le cache de premier niveau de Hibernate fait référence au cache à l'échelle de la session, qui est activé par défaut. Le cache de deuxième niveau est le cache de plage SessionFactory. Lors de la configuration de SessionFactory, nous avons configuré le cache de deuxième niveau en tant qu'Ehcache. Ensuite, nous vérifions l'effet et interrogeons l'opération utilisateur. Nous avons constaté que la première requête exploitera la base de données, imprimera l'instruction SQL, et après avoir rafraîchi la page, nous avons constaté que la requête était réussie et qu'aucune instruction SQL n'a été imprimée. Comme le montre la figure ci-dessous, nous pouvons voir que le travail de cache secondaire est OK;
4. Comprendre la configuration des choses à ressort et vérifier
Le principe dit de contrôle des transactions est le même, qui est d'assurer l'atomicité, la cohérence, l'isolement et la persistance. Lors de la programmation de JDBC, il est contrôlé par lui-même. Définissez AutoCommit = false pour ne pas soumettre automatiquement, puis commencez à écrire des opérations de base de données spécifiques. Lorsqu'une exception se produit, Rollback, autrement, s'engagez; En fait, le principe de contrôle du ressort sur les choses est similaire, et il est ajouté avec certains emballages, configuration, etc., ce qui est plus pratique, comme contrôler différentes méthodes dans la couche de service;
La vérification est très simple. Écrivez deux opérations d'insertion dans une méthode au niveau du service (notez que le nom de la méthode doit se conformer aux règles configurées dans le fichier de configuration de Spring), lancez une exception au milieu, puis exécutez-la. Si vous constatez que le premier utilisateur est inséré avec succès, cela signifie que le contrôle des transactions n'est pas valide, sinon il est OK;
5. Comprendre le CIO de Spring (injection de dépendance), remettre l'objet d'action (haricot) de Struts2 à la gestion du printemps, des haricots personnalisés, etc., et vérifiez
Si vous observez attentivement, dans le processus de configuration du fichier ApplicationContext.xml, le travail principal est de configurer des informations liées au bean. Ces haricots sont créés à l'avance, mais en fait les soi-disant haricots sont des objets;
Le but de remettre la création d'objets au conteneur à ressort est de se découpler;
De plus, lors de l'utilisation de Struts, Spring enregistre l'action en tant que Bean, qui est un singleton par défaut. Chaque fois qu'une nouvelle action est émise pendant l'accès, il y aura des risques lors de l'accès simultané;
Cependant, vous pouvez configurer l'action en plusieurs cas via scope = "prototype"; PS: L'action dans Struts2 est multi-cas par défaut;
Remarque: Les beans configurés dans ApplicationContext.xml et les beans configurés dans des annotations personnalisées peuvent être obtenus directement lors de l'exécution du programme. C'est facile à vérifier, écrivez simplement un petit programme;
6. Comprendre Spring AOP (programmation orientée section) et écrire des fonctions de section personnalisées pour vérifier les résultats
Cette idée est utilisée dans de nombreux endroits de cette forme de programmation en coupe, telles que les filtres, les intercepteurs, le contrôle des transactions, etc.
Le principe est la réflexion Java et le proxy dynamique, qui contrôle la méthode avant et après l'exécution, et ajoute le code que vous souhaitez exécuter;
Une section est ajoutée au petit exemple, et avant et après les chaînes imprimées avant et après l'exécution de la méthode. Comme le montre la figure ci-dessous, cela fonctionne normalement. Veuillez vous référer à la partie précédente du code:
<! - Test de traitement AOP personnalisé -> <bean id = "aoptest"> </ank> <bean id = "myaop"> </ank> <aop: config proxy-target-class = "true"> <aop: aspect ref = "myaop"> <aop: Pointcut id = "pcMethodTest" expression = "exécution (* ssh.aop.aoptest.Te *.) <aop: avant Pointcut-ref = "pcMethodTest" méthode = "avant" /> <aop: after Pointcut-ref = "pcMethodTest" method = "after" /> </ aop: aspect> </ aop: config>
@author un codeur de vent
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.