Aujourd'hui, je continue de mettre en œuvre AOP. Je pense personnellement que c'est la manière la plus flexible et la plus extensible. Prenez l'exemple de la gestion des journaux, en utilisant le formulaire d'annotation personnalisé Spring AOP pour implémenter la gestion des journaux. Sans plus tarder, commencez tout de suite! ! !
Je vais répéter la configuration.
Quoi ajouter dans ApplicationContext-Mvc.xml
<MVC: Annotation-Driven /> <! - Activez la fonction de numérisation des composants, numérisant automatiquement les composants configurés via l'annotation sous package com.gcx et ses sous-packages -> <Context: Component-Scan Base-Package = "com.gcx" /> <! - Démarrer le support pour @aspectj Annotation -> <! La classe de cible proxy est fausse par défaut. Si votre classe implémente l'interface, accédez au proxy JDK. Sinon, accédez à CGLIB Proxy -> <! - Remarque: il est recommandé d'utiliser le proxy CGLIB pour le mode de profit simple. Bien que le proxy dynamique JDK soit plus rapide que le proxy CGLIB, ses performances ne sont pas aussi bonnes que CGlib -> <! - Si vous n'écrivez pas Proxy-Target-Class = "True" La phrase est OK -> <aop: Aspectrj-Autopproxy Proxy-Target-Class = "True" /> <!
Ensuite, commencez à écrire le code.
Créer une entité logarithmique
classe publique SystemLog {ID de chaîne privée; Description de la chaîne privée; Méthode de chaîne privée; LogType long privé; Private String requestIP; chaîne privée ExceptionCode; chaîne privée exceptionDetail; Params de chaîne privées; String privé CreateBy; Date privée CréationDate; public String getID () {return id; } public void setid (String id) {this.id = id == null? null: id.trim (); } public String getDescription () {return Description; } public void setDescription (String Description) {this.description = description == null? null: description.trim (); } public String getMethod () {return Method; } public void setMethod (méthode de chaîne) {this.method = méthode == null? null: méthode.trim (); } public long getLogType () {return LogType; } public void setLogType (long logType) {this.logType = LogType; } public String getRequeStip () {return requestIp; } public void setRequeStip (String requestIp) {this.requeStip = requestIp == null? null: requestIp.trim (); } public String getExceptionCode () {return exceptionCode; } public void setExceptionCode (String exceptionCode) {this.exceptioncode = exceptionCode == null? null: exceptioncode.trim (); } public String getExceptionDetail () {return exceptionDetail; } public void setExceptionDetail (String exceptionDetail) {this.exceptiondetail = exceptionDetail == null? null: exceptionDetail.trim (); } public String getParams () {return params; } public void setParams (String Params) {this.params = params == null? null: params.trim (); } public String getCreateBy () {return CreateBy; } public void setCreateBy (String createby) {this.createby = createby == null? null: createby.trim (); } public Date getCreatEdate () {return CreateDate; } public void setCreatEdate (date créée) {this.createdate = CreateDate; }}Écrire une interface DAO
package com.gcx.dao; import com.gcx.entity.systemlog; interface publique systemLogMapper {int DeleteByprimaryKey (String id); INT INSERT (SystemLog Record); int InteserSelective (SystemLog Record); SystemLog SelectByPrimaryKey (String ID); int updateByPrimaryKey (SystemLog Record);}Rédaction d'une couche de service
package com.gcx.service; import com.gcx.entity.SystemLog; interface publique SystemLogService {int DeleteSystemLog (String id); INT INSERT (SystemLog Record); int INSERTTEST (SystemLog Record); SystemLog SelectSystemLog (String ID); int updateSystemLog (SystemLog Record);}Écrire des services de mise en œuvre du service ServiceImpll
package com.gcx.service.impl; import javax.annotation.resource; import org.springframework.sterreotype.service; import com.gcx.annotation.log; import com.gcx.dao.systemlogmapper; import com.gcx.entity.systemlog; com.gcx.service.SystemLogService; @Service ("SystemLogService") Public Class SystemLogServiceImplt implémente SystemLogService {@Resource Private SystemLogMapper SystemLogMapper; @Override public int DeleteSystemLog (String id) {return SystemLogMapper.DeleteByPrimaryKey (id); } @Override public int insert (systemlog enregistre) {return SystemLogMapper.InsertSelective (enregistrement); } @Override public SystemLog SelectSystemLog (String id) {return systemLogMapper.SelectByprimaryKey (id); } @Override public int updateSystemLog (SystemLog Record) {return SystemLogMapper.UpDateByPrimaryKeySelective (enregistrement); } @Override public int insertTest (SystemLog Record) {return systemLogMapper.insert (enregistrement); }}Ici, le programme de base est terminé
Vous trouverez ci-dessous l'annotation personnalisée
Package com.gcx.annotation; Importer java.lang.annotation. *; @ Target ({elementType.Parameter, elementType.Method}) @retention (RetentionPolicy.Runtime) @Documented Public @Interface Log {/ ** Le type d'opération à effectuer, tel que: ajouter l'opération ** / public String OperationType () par défaut ";"; / ** L'opération spécifique à effectuer, telle que: Ajouter un utilisateur ** / public String operationName () par défaut "";}Écrivez la coupe ci-dessous
package com.gcx.annotation; import java.lang.reflect.method; import java.util.date; import java.util.uuid; import javax.annotation.resource; import javax.servlet.http.httpservlersession; import javax.servlet.http.httpSession; import; org.aspectj.lang.joinpoint; import org.aspectj.lang.proceedingjoinpoint; import org.aspectj.lang.annotation.after; import org.aspectj.lang.annotation.afterreturning; import org.aspectj.lang.annotation.afterthrowing; import org.aspectj.lang.annotation.around; org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.before; import org.aspectj.lang.annotation.pointcut; import org.slf4j.logger; important org.slf4j.logger com.gcx.entity.systemlog; import com.gcx.entity.user; import com.gcx.service.systemlogservice; import com.gcx.util.jsonutil; / ** * @author yang jian * @ e-Mail: email * @version Time: 2015-10-19 4:29:05 classe * / @ aspect @ ComponentPublic classe SystemLogaSpect {// Injecter le service pour enregistrer les journaux dans la base de données @Resource // J'utilise l'annotation des ressources ici, généralement en utilisant @autowired. Leurs différences. Si j'ai le temps, j'écrirai Private SystemLogService SystemLogService dans le blog suivant; Logger final statique privé = loggerfactory.getLogger (SystemLogaSpect. Classe); // Contrôleur Couche Tangent Point @PointCut ("Exécution (* com.gcx.Controller .. *. * (..))") public void ControlleraSpect () {} / ** * pré-notification est utilisé pour intercepter la couche de contrôleur pour enregistrer les opérations de l'utilisateur * * @param joinpoint point Tangent Point * / @before ("ContrôleraSpect ()") ") { System.out.println("====================================================================================================== ======================================================================. ======================================================================. ======================================================================. ======================================================================. ======================================================================. =======================================================================. System.out.println ("========================================================================================================================================================================================================. (ProcedingJoinSpoint). System.out.println("============================================================================ System.currentTimeMillis(); if(logger.isInfoEnabled()){ Logger.info ("autour" + jointure + "/ tuuse Time:" + (end - start) + "ms avec exception:" + e.getMessage ());}}} / ** * La notification de publication est utilisée pour intercepter le calcul du contrôleur pour enregistrer les opérations de l'utilisateur * * @param joinpoint tangent point * / @after ("ControgeraSpect ()") public Void après (jointure) {* * * ControgeraSpect () ") HttpServleRequest Request = (ServLetRequestAtTributes). = nouveau utilisateur (); Class.forname (TargetName); Method.getAnnotation (log.class) .OperationType (); System.out.println ("Méthode de la demande:" + (jointure.getTarget (). GetClass (). GetName () + "." + JoindPoint.getSignature (). GetName () + "()"). "+ OperationType); System.out.println ("Demande IP:" + ip); Log.SetMethod (jointure. Log.setParams (null); Logger.Error ("== Exception post-notification =="); Exécuter la notification post-retour du contrôleur =======); doafterthrowing (joinpoint joinpoint, throwable e) {/ * httpServleRequest request = (servLetRequestAtTributes) requestContexTholder.getRequestAtTributes (). GetRequest (); // GOOD IP IP = request jointure.getArgs (). Longueur> 0) {pour (int i = 0; i <joinpoint.getargs (). Longueur; i ++) {params + = jsonUtil.getjSontr (joindPoint.getArgs () [i]) + ";"; jointure.getSignature (). GetName (); Method.getParameterTypes (); System.out.println ("================ Notification d'exception start======================================================================================= ==================================================================================================. ==================================================================================================. ==================================================================================================. System.out.println ("Informations d'exception:" + e.getMessage ()); System.out.println ("Requestr:" + user.getName ()); Log.SetId (UUID.RandomuUid (). ToString ()); Log.SetMethod (jointure SystemLogService.Insert (Log); ex.getMessage ());} / * ====================== * / Logger.Error ("Méthode d'exception: {} Code d'exception: {} Informations d'exception: {} Paramètres: {}", jointpoint.getSigny (). GetClass (). GetName () + jointure. e.getClass (). getName (), e.getClass (). getName (), params);J'ai beaucoup écrit ici, y compris la pré-préavis, la notification surround, la post-notification, la notification d'exception et la notification post-repas. Ce n'est pas grave si je n'écris pas tout dans notre écriture réelle. J'ai l'habitude d'écrire la logique de la journalisation dans le post-log. Je vois que certaines des notifications pré-logarithmiques sont également incluses dans les notifications de pré-logarithme sur Internet, mais je pense qu'il vaut mieux l'écrire dans les notifications post-log.
Commençons à ajouter des annotations personnalisées au contrôleur! !
package com.gcx.controller; import org.springframework.beans.factory.annotation.autowired; import org.springframework.sterreotype.controller; import org.springframework.web.bind.annotation.requestmapping; import com.gcx.service.userservice; @ contrôleur @ requestmapping ("userController") classe publique UserController {@Autowired Private UserService UserService; @RequestMapping ("testaop") @log (operationtype = "Ajouter l'opération:", operationname = "add user") public void testaop (String username, String Motway) {userservice.adduser (nom d'utilisateur, mot de passe); }}Écrivez la classe de test ci-dessous
@Test public void testaop1 () {// Démarrer le conteneur de Spring ApplicationContext ctx = new classpathxmlapplicationContext (new String [] {"classPath: applicationContext-mvc.xml", "classPath: applicationContext-Datasource.xml"}); // Obtenez le composant de service ou de contrôleur UserController UserController = (userController) ctx.getBean ("userController"); userController.testaop ("Zhangsan", "123456"); }Données de base de données:
Je voulais à l'origine écrire deux points tangents, l'un est la couche de service et l'autre est la couche de contrôleur. La couche de service est utilisée pour enregistrer les informations d'exception, tandis que la couche de contrôleur est utilisée pour enregistrer les fonctions. Le résultat en cours d'exécution est le suivant.
Si vous faites cela, je ne sais pas si l'efficacité de l'opération est bonne dans le projet réel. Veuillez consulter le Daniu du blog ici pour faire quelques suggestions! !
L'exemple d'exemple ci-dessus de la méthode d'annotation personnalisée Spring AOP pour implémenter la gestion des journaux est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.