Requisito de fundo
Em um projeto recente, quando o projeto é basicamente concluído, o cliente propôs registrar os registros de todas as operações comerciais no banco de dados e extrair algumas informações importantes de negócios (como números de pedidos de transação) no log.
Para garantir o período de construção, depois de revisar as informações, decidi usar anotações personalizadas da AOP + para concluir esse requisito.
Preparação
Os pacotes JAR que precisam depender para anotações personalizadas incluem aspectojrt-xxx.jar, aspectojweaver-xxx.jar e xxx representa o número da versão.
Anotações personalizadas
Um pacote de log separado é criado sob o projeto para armazenar conteúdo relacionado ao log
**.
Crie uma nova classe de anotação personalizada no pacote de anotação:
package **.common.log.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)public @interface XXXOPERATATELOG { / *** Tipo de operação Descrição* @return* / string operatetypeDesc () padrão ""; / *** Tipo de operação* @return*/ long Operatetype () padrão -1; / *** codificação do módulo* @return*/ string mousecode () padrão "m30"; / *** Nome do módulo* @return*/ string mousename () padrão "xx módulo"; / *** Tipo de negócios* @return*/ string busStype () padrão ""; / *** Tipo de negócios Descrição* @return*/ string busStypeDesc () padrão "";}Crie um novo XXXOPERATELOGAOP sob o pacote AOP
pacote **. Common.log.aop; importação **; // omit @aspecto @componentpublic classe xxxoperatelogaop {@AUTowired SystemLogService SystemLogService; HttpServletRequest request = null; Logger Logger = LoggerFactory.getLogger (xxxoperatelogaop.class); Threadlocal <long> time = new Threadlocal <long> (); // ID exclusivo usado para gerar logs de operação, usados para chamar public static for Business Process Audit Logs ThreadLocal <String> tag = new ThreadLocal <String> (); // Declare o ponto de entrada da AOP, qualquer método que use XXXOPERATELOG é interceptado @PointCut (" @anotação (**. Common.log.annotation.xxxoperatelog)") public void log () {System.out.println ("sou um ponto de entrada"); } / *** Corte em todos os lugares marcados @log* @param junçãoPoint* / @Before ("LOG ()") public void Antesexec (junção JUNJOint) {time.set (System.currenttimemillis ()); info (ponto de junta); // Defina o número de identificação exclusivo de registros de log tag.set (uuid.randomuuid (). Tostring ()); solicitação = ((servletRequestattributes) requestContextholder.getRequestattributes ()). getRequest (); } @After ("log ()") public void AfterExec (junção jun juntpoint) {MethodSignature ms = (MethodSignature) junçãoPoint.getSignature (); Método método = ms.getMethod (); logger.debug ("tag como" + tag.get () + "método" + method.getName () + "execute consumo" + (system.currenttimemillis () - time.get ()) + "ms"); } // No processo de execução do método de destino, esse método será executado e o registro pode ser implementado aqui @Alound ("log ()") Public Object AOBSEXEC (ProceedingJoinPoint PJP) lança lançável {object ret = pjp.proeced (); tente {object [] orgs = pjp.getargs (); Systemlog valuereTurn = null; for (int i = 0; i <orgs.length; i ++) {if (orgs [i] instanceof SystemLog) {valuereTurn = (SystemLog) orgs [i]; }} if (valuereTurn == null) {valuereTurn = new Systemlog (); } if (valuereTurn! = null && request! = null) {MethodSignature ms = (MethodSignature) pjp.getSignature (); Método método = ms.getMethod (); // Obtenha as informações do log de operação da anotação xxxoperatelog log = method.getannotation (xxxoperatelog.class); String BusinessType = log.busStype (); String BusinessDesc = log.busStyPedesc (); Hashmap requestMap = servletutils.getParameterStoHashMap (solicitação); // Procure por tipo de negócios em Parâmetros se (BusinessType.equals ("" ")) {objeto objbusinessType = requestmap.get (" Business_Type "); BusinessType = objbusinessType == NULL? "": objbusinessType.toString (); } // Encontrou o tipo de negócio do formulário de inscrição para o objeto de resultado da execução Aplicação = request.getAttribute ("Aplicar"); if (apply! = null) {jsonObject obj = jsonFactory.tojsonabstractentity (apply); if (obj! = null) {valuereTurn.setotherdesc ("aplique o número:"+obj.getString ("apply_no")); if (businesstype.equals ("")) {BusinessType = obj.getString ("Business_Type"); }}} // Encontrando o tipo de negócio a partir dos parâmetros do processo de execução do método (geralmente definido manualmente) se (BusinessType.equals ("" ")) {BusinessType = (String) request.getAttribute (" Business_Type "); BusinessType = BusinessType == NULL? "": BusinessType; } if (! BusinessType.equals ("") && BusinessDesc.equals ("")) {BusinessDesc = xxxsysConstant.business_type.getName (BusinessType); } valuereTurn.setBusStype (xxxsysConstant.business_type.getNumber (BusinessType)); valuereTurn.setBusStypeDesc (BusinessDesc); valuereTurn.setMoudLecode (log.moudLecode ()); valuereTurn.setMoudleName (log.moudleName ()); valuereTurn.setOperateSult (xxxsysConstant.yesorno.yes); valuereTurn.setOperatetype (log.operatetype ()); valuereTurn.setInputUserID ((((UserContext) webutils.getSessionAttribute (solicitação, "xxxuserContext"). valuereTurn.setOperateTypeDesc (log.operateTypeDesc ()); valuereTurn.setRequestip (getRemoteHost (solicitação)); valuereTurn.setRequesturl (request.getRequesturi ()); valuereTurn.SetServeRip (request.getLocaladdr ()); valuereTurn.setUids (tag.get ()); // Salvar o Log Operação SystemlogService.SaveSystemLog (ValuereTurn); } else {Logger.info ("Não registre informações de log"); } // Salvar o resultado da operação} Catch (Exceção e) {E.PrintStackTrace (); } retornar retorno; } // Registre o log de exceção @afterwrowing (Pointcut = "LOG ()", throwing = "e") public void DoafterWring (juntpoint junçãopoint, throwable e) {try {info (junção); Objeto [] orgs = jun juntpoint.getargs (); Systemlog valuereTurn = null; for (int i = 0; i <orgs.length; i ++) {if (orgs [i] instanceof SystemLog) {valuereTurn = (SystemLog) orgs [i]; }} if (valuereTurn == null) {valuereTurn = new Systemlog (); } if (valuereTurn! = null && request! = null) {MethodSignature ms = (MethodSignature) junçãoPoint.getSignature (); Método método = ms.getMethod (); XXXOPERATATELOG LOG = Method.getAnnotation (xxxoperatelog.class); String BusinessType = log.busStype (); String BusinessDesc = log.busStyPedesc (); if (businesstype.equals ("")) {object objbusinessType = servletutils.getparameterStohashmap (request) .get ("Business_type"); BusinessType = objbusinessType == NULL? "": objbusinessType.toString (); BusinessDesc = xxxsysConstant.business_type.getName (BusinessType); } valuereTurn.setBusStype (xxxsysConstant.business_type.getNumber (BusinessType)); valuereTurn.setBusStypeDesc (BusinessDesc); valuereTurn.setMoudLecode (log.moudLecode ()); valuereTurn.setMoudleName (log.moudleName ()); valuereTurn.setOperatetype (log.operatetype ()); valuereTurn.setOperateTypeDesc (log.operateTypeDesc ()); valuereTurn.setInputUserID ((((UserContext) webutils.getSessionAttribute (solicitação, "xxxuserContext"). valuereTurn.setOperateSult (xxxsysConstant.yesorno.no); String errmes = e.getMessage (); if (errmes! = null && errmes.length ()> 800) {errmes = errmes.substring (0, 800); } valuereTurn.SterRorMessage (ERRMES); valuereTurn.setRequestip (getRemoteHost (solicitação)); valuereTurn.setRequesturl (request.getRequesturi ()); valuereTurn.SetServeRip (request.getLocaladdr ()); valuereTurn.setUids (tag.get ()); SystemLogService.SaveSystemLog (ValuereTurn); } else {logger.info ("nenhuma informação de log é gravada"); }} catch (Exceção E1) {e1.printStackTrace (); }} Informações sobre void privado (JUNCIPIGN JUNJOint) { logger.debug("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Object[] OS = junção.getargs (); Logger.debug ("Sourcelocation:/t" + junção.getSourcelocation ()); Logger.debug ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- request.getheader ("proxy-client-ip"); "Desconhecido" .equalsignorecase (ip)) {ip = request.getRemoteaddr ();Modifique o arquivo de configuração Spring-mvc.xml e adicione a seguinte configuração
<!-Ligue a interceptação da AOP-> <AOP: AspectJ-AutoProxy Proxy-Target-Class = "True" /> <MVC: anotação-driven /> <!-Defina o escopo da mola Descrição Bean-> <Contexto: Package Base = "**. expressão = "org.springframework.stereotype.controller"/> </context: component-scan>
Deve-se notar que a configuração acima deve ser colocada no mesmo arquivo XML, spring-mvc.xml ou spring-context.xml, caso contrário, pode não entrar em vigor e o motivo ainda não foi encontrado.
Uso de anotações
@XXXOperateLog( bussType=XXXSysConstant.BUSINESS_TYPE.YYYY,bussTypeDesc="Business Type Description" ,operateType = XXXSysConstant.LogOperateType.QUERY,operateTypeDesc = "Operation Description" ) @RequestMapping(value = "/**/**/queryXXXX4DataGrid.json", method = RequestMethod.post) public void queryxxxxxx4datagrid (solicitação httpServletRequest, httpServletResponse arg1, modelo, modelo, escritor escritor) { logger.info("============================================================================================= HttpServletResponse arg1, Model model, Writer writer) { logger.info("=============================== HttpServletResponse arg1, Model model, Writer writer) { logger.info("========================= HttpServletResponse arg1, Model model, Writer writer) { Logger.info ("===================== HttpServletResponse arg1, modelo modelo, escritor de escritores) {Logger.info (" =================== HTTPLEVLETLETRESPONSEIRO ARG1, Modelo, Model, escritor) {gravador). Logger.info ("=================== HttpServletResponse arg1, modelo modelo, escritor escritor) {Logger.info (" ===================== HTTPSERVletLear Logger.info ("==================== HttpServletResponse arg1, modelo modelo,A anotação personalizada do Springmvc acima, o método de usar aOP para perceber que o registro é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.