1. 程式人生 > >spring實現service層日誌管理

spring實現service層日誌管理

現在為了便於管理系統,配置一個日誌表,當用戶登入系統以及對系統資料進行增刪改操作時要將使用者的資訊存入到資料庫

//1.自定義註解

package com.zipx.util.systemlog;

import java.lang.annotation.Documented;

 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * 自定義註解 攔截service的日誌
 * @author 趙寶旗
 *
 */
@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemServicelog {
    
    String description() default "";
}


2.實現攔截新增修改刪除操作的業務

package com.zipx.util.systemlog;


import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.*;

import com.zipx.entity.SystemLog;
import com.zipx.entity.system.SystemUser;
import com.zipx.service.LogService;
import com.zipx.util.Const;

/**
 * 建立切點類
 *
 * @author 趙寶旗
 *
 */
@Aspect
@Component
public class SystemLogAspect {
    // 注入service將日誌儲存到資料庫
    @Resource
    private LogService logService;
    // 本地異常日誌記錄物件
    private static final Logger logger = LoggerFactory
            .getLogger(SystemLogAspect.class);

    // service層的且切點
    @Pointcut("execution(* com.zipx.service..*(..))")
    public void serviceAspect() {

    }

    // 前置通知用於攔截service層的日誌
    @Before("serviceAspect()")
    public void doAfter(JoinPoint joinPoint) throws Exception {
        // 獲取包括包名在內的全方法名
        String allmethodName = joinPoint.getTarget().getClass().getName() + "."
                + joinPoint.getSignature().getName() + "()";

        // 獲取請求的方法
        String requstMethodName = joinPoint.getSignature().getName() + "()";
        // 判斷如果是查詢方法就不記錄到資料庫裡面insert update delete
        String methodName = requstMethodName.substring(0, 6);
        // requstMethodName.startsWith(prefix, 0)
        if (methodName.equals("insert") || methodName.equals("update")
            || methodName.equals("delete") || methodName.equals("create")
            || methodName.equals("save") || methodName.equals("add")) {

            if (RequestContextHolder.getRequestAttributes() != null) {

                int systemUserId;
                HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
                        .getRequestAttributes()).getRequest();
                SystemUser user = (SystemUser) request.getSession()
                        .getAttribute(Const.SESSION_USER);
                if (request == null) {
                    systemUserId = 0;
                }
                // 讀取session裡面的使用者

                if (user == null) {
                    systemUserId = 0;
                } else {
                    systemUserId = user.getsystemUserID();
                }

                // 獲取請求的ip
                String ip = request.getRemoteAddr();

                SystemLog log = new SystemLog();
                log.setSystemUserId(systemUserId);
                log.setMethodName(allmethodName);
                log.setIp(ip);
                log.setCreatedDate(new Date());
                log.setDescription(getServiceMethodDescription(joinPoint));
                logService.SystemLog(log);
            }
        }

    }

    /**
     * 獲取註解中對方法的描述資訊 用於service層註解
     *
     * @throws ClassNotFoundException
     */
    public static String getServiceMethodDescription(JoinPoint joinPoint)
            throws ClassNotFoundException {

        // String targetName = .getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] arguments = joinPoint.getArgs();
        Class targetClass = joinPoint.getTarget().getClass();// Class.forName(targetName);
        Method[] methods = targetClass.getMethods();
        String description = "";
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                Class[] clazzs = method.getParameterTypes();
                if (clazzs.length == arguments.length) {
                    if (method.getAnnotation(SystemServicelog.class) != null) {

                        description = method.getAnnotation(
                                SystemServicelog.class).description();
                        if (description == null) {
                            description = "";
                        }
                        break;
                    }
                }
            }
        }
        return description;

    }

}

3.在service對應的新增修改刪除方法加入註解

@SystemServicelog(description = "刪除訂單")
    public boolean deleteOrderInfoByOrderId(String orderId) throws Exception {
        if (orderId.equals("")) {
            return false;
        }
        PageData pd = new PageData();
        pd.put("orderId", orderId);
        Integer i = (Integer) dao.update("OrderHeaderMapper.deleteOrderInfoByOrderId", pd);
        if (i > 0) {
            OrderHeader oh = findOrderByOrderID(Integer.valueOf(orderId));
            if (oh.getPrealertId() != null) {
                // 修改prealert狀態為OrderDeleted
                if (prealertService.updatePrealertStatus(oh.getPrealertId(), "OrderDeleted")) {
                    return true;
                }
            }
        }
        return false;
    }


相關推薦

spring實現service日誌管理

現在為了便於管理系統,配置一個日誌表,當用戶登入系統以及對系統資料進行增刪改操作時要將使用者的資訊存入到資料庫 //1.自定義註解 package com.zipx.util.systemlog; import java.lang.annotation.Documented

spring service事務管理小結

前言: 選擇spring作為開發的框架,很大一部分因素是spring框架完善的事務處理機制,spring的事務實現主要分為兩種,一種是基於Dao層,另一種是基於Service層,前者是針對單個dao的持久化操作做了事務控制,控制粒度比較小,後者則是基於業務的原則性需求,將一個原子性業務的

筆記有關在spring使用aop在實現service時出現的問題

java.lang.IllegalStateException: Failed to check the status of the service com.groupds.api.Discharge_recordService. No provider available

SpringAOP+註解實現簡單的日誌管理

vax 技術 eight 如果 日誌類 lex 時間 str component      今天在再次深入學習SpringAOP之後想著基於註解的AOP實現日誌功能,在面試過程中我們也經常會被問到:假如項目已經上線,如何增加一套日誌功能?我們會說使用AOP,AOP也符合開

Spring Boot (四):日誌管理

預設情況下,Spring Boot會用Logback來記錄日誌,並用INFO級別輸出到控制檯。在執行應用程式和其他例子時,你應該已經看到很多INFO級別的日誌了。 1、新增依賴 maven依賴中添加了spring-boot-starter-loggi

spring-boot servicejunit單元測試

只要加@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = StartupApplication.class) 兩個註解就可以引入service進行單元測試了 @RunWith(Spring

springservice獲取session和request

首先要在web.xml增加如下程式碼: <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</li

service介面有什麼用?引申到基於JDK原生和CGLIB動態代理實現spring事務管理的機制的思考

問題1:Services層為什麼要用(Services介面 類 + Services介面實現 類)分開,這樣做有什麼好處? 總結: 1.程式設計介面化, 2.Spring的事物管理預設用的是java動態代理。 問題2:Spring事物管理實現的機制

Spring AOP攔截Service實現日誌管理(自定義註解的方式)

最近專案中用到AOP方式進行Service操作方法日誌管理,特為之記! 1、先說理論和採用的方法 採用註解的方式,其中包括以下註解:@Aspect(類註解)和@AfterReturning(方法註解),其中需要用的Maven庫如下: "org.aspectj:aspect

Spring AOP 自定義註解實現日誌管理

目錄 一、配置檔案 二、新建一個日誌實體類Log 三、編寫 service 層 四、編寫 service 層的實現 serviceimpl 五、自定義註解類 六、編寫切面類 七、spring + aop 需要的 jar 包 部落格的程式碼是基於 SSM 環境編寫的

spring-AOP+自定義註解實現日誌管理(註解方式實現

一、場景 後臺管理系統中,管理員作業系統時生成日誌儲存在資料庫中。 二、實現 1、jar包依賴 <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency&

關於spring管理service的兩種方法

我們知道,在框架的專案中都是使用spring來管理物件的。那麼service層也就是業務層spring有兩種管理的方式。 1.使用xml檔案的形式管理 在spring的使用xml配置檔案:applicationContext.xml(名字隨便取)中去配置寫好的service層的類。例如:這裡

Spring AOP 的實現方式(以日誌管理為例)

一、為什麼需要AOP 假如我們應用中有n個業務邏輯元件,每個業務邏輯元件又有m個方法,那現在我們的應用就一共包含了n*m個方法,我會抱怨方法太多。。。現在,我有這樣一個需求,每個方法都增加一個通用的功能,常見的如:事務處理,日誌,許可權控制。。。最容易想到的方法,先定義一個

Spring Boot 整合 log4j2 實現日誌管理

摘要:上一篇,我們講了Spring Boot 整合 log4j實現日誌管理,這一篇接著說一下Spring Boot 整合 log4j2,。 一:還是新建一個java工程: 二:增加log4j2的pom.xml配置,如下: <project xmlns="htt

spring+mybatis通用daoservice的一些個人理解與實現

1、現在的絕大多數web應用,通常都以action、service、dao三層去組織程式碼,這樣劃分結構很清晰,分工明確 2、一般情況下,我們會把事務控制在service層。 3、action和dao層,會使用一些框架技術。比如action層可能選擇有springmvc、struts等,dao層有hibe

Spring Boot 整合 log4j 實現日誌管理報錯:java.lang.IllegalArgumentException: LoggerFactory is not a Logback

問題: Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Log

Spring Boot 整合 log4j 實現日誌管理

摘要:最近有時間,系統的學習了一下Spring Boot框架,感覺Spring Boot很好的集成了各種框架和元件,之前我們用Spring的時候,要配置好的依賴和xml檔案,現在使用Spring Boot,只需要一些少量的配置就可以實現。今天我們來看下Spring Boot

SpringAOP攔截Controller,Service實現日誌管理(自定義註解的方式)

         首先我們為什麼需要做日誌管理,在現實的上線中我們經常會遇到系統出現異常或者問題。這個時候就馬上開啟CRT或者SSH連上伺服器拿日子來分析。受網路的各種限制。於是我們就想為什麼不能直接在管理後臺檢視報錯的資訊呢。於是日誌管理就出現了。          其次

Spring的AOP實現日誌管理操作

關於這個aop,有時候面試官會經常問道這類的問題,比如說,你使用aop來實現日誌管理,那麼你的aop實現的時候,怎麼來獲取到你要的引數,如何還有你現在執行的操作命令? 今天就對這個問題進行測試解答。 文章宣告:此文章僅供測試,如有功能不全請諒解。 讀者最好對通知類,切入

spring 事務管理——回滾之service(事務控制)程式碼互調

spring事務管理相關的文章已經有很多了,本人寫此文章主要為自己的實驗做一個記錄,年紀大了,記性不好 首先先貼幾個地址,有興趣研讀的同學可以參考一下: 初級使用: 初級容易犯的錯:事務中catch異常 官方介紹: 預設回滾配置實驗: 以上幾個地址是從不同的角度來