spring aop處理日誌

源碼

一、依賴包導入

除了需要導入相關的spring的包,還要添加三個jar包。aopallianceaspectjrtaspectjweaver。在這裏我導入的是aopalliance-1.0.jar,aspectjrt-1.9.1.jar,aspectjweaver-1.9.1.jar

二、自定義註解類

import java.lang.annotation.*;

@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperateLog {
    //操作模塊
    String operatorModule() default "";
}

三、實體類

日誌實體類,用於記錄修改的日誌

package com.howen.entity;

public class LogEntity {
    private String operator;

    private String date;

    private String operated;

    private Object changeBefore;

    private Object changeAfter;

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getOperated() {
        return operated;
    }

    public void setOperated(String operated) {
        this.operated = operated;
    }

    public Object getChangeBefore() {
        return changeBefore;
    }

    public void setChangeBefore(Object changeBefore) {
        this.changeBefore = changeBefore;
    }

    public Object getChangeAfter() {
        return changeAfter;
    }

    public void setChangeAfter(Object changeAfter) {
        this.changeAfter = changeAfter;
    }

    @Override
    public String toString() {
        return "LogEntity{" +
                "operator='" + operator + '\'' +
                ", date='" + date + '\'' +
                ", operated='" + operated + '\'' +
                ", changeBefore=" + changeBefore +
                ", changeAfter=" + changeAfter +
                '}';
    }
}

學生實體類

package com.howen.entity;

public class Student {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

四、controller

package com.howen.controller;
import com.howen.config.OperateLog;
import com.howen.db.DBConfig;
import com.howen.entity.Student;
import com.howen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class StudentController {

    @Autowired
    StudentService studentService;


    @OperateLog(operatorModule = "修改" )
    @RequestMapping(value = "/change")
    public String change(int id, String address,int age){
        boolean isChanged = StudentService.change(id,address,age);
        return "success";
    }

    @OperateLog(operatorModule = "添加")
    @RequestMapping(value = "/add")
    public String add(int id,String name,String address,int age,String sex){
        Student student = new Student();
        student.setAge(age);
        student.setAddress(address);
        student.setId(id);
        student.setName(name);
        student.setSex(sex);
        System.out.println(student.toString());
        DBConfig.studentDB.put(id,student);
        return "success";
    }
}

五、service

package com.howen.controller;
import com.howen.config.OperateLog;
import com.howen.db.DBConfig;
import com.howen.entity.Student;
import com.howen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class StudentController {

    @Autowired
    StudentService studentService;


    @OperateLog(operatorModule = "修改" )
    @RequestMapping(value = "/change")
    public String change(int id, String address,int age){
        boolean isChanged = StudentService.change(id,address,age);
        return "success";
    }

    @OperateLog(operatorModule = "添加")
    @RequestMapping(value = "/add")
    public String add(int id,String name,String address,int age,String sex){
        Student student = new Student();
        student.setAge(age);
        student.setAddress(address);
        student.setId(id);
        student.setName(name);
        student.setSex(sex);
        System.out.println(student.toString());
        DBConfig.studentDB.put(id,student);
        return "success";
    }
}

六、定義aop

實際參數,可以通過debug查看相應的參數,從而獲取你所需要的

package com.howen.controller;

import com.howen.config.OperateLog;
import com.howen.entity.LogEntity;
import com.howen.service.StudentService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 這裏不增加Component註解的話,該類是無法進行掃描的
 */
@Aspect
@Component
public class LogAopAtion {
    /**
     * 可以將日誌信息存入數據庫
     */
    @Resource
    StudentService studentService;

    @Pointcut("execution(* com.howen.controller.StudentController.*(..))")
    private void controllerAspect(){}

    @Around("controllerAspect()")
    public Object doAdd(ProceedingJoinPoint pjp) throws Throwable {
        LogEntity logEntity = new LogEntity();
        logEntity.setOperator("從系統獲取");
        System.out.println("------------------------------------------");
        String time = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());
        logEntity.setDate(time);
        //獲取攔截的實體類,就是正在執行的controller
        Object target = pjp.getTarget();
        //攔截的方法名稱。正在執行的方法
        String methodName = pjp.getSignature().getName();
        //攔截的方法參數
        Object [] args = pjp.getArgs();
        //攔截的放參數類型
        Signature sig = pjp.getSignature();

        MethodSignature msig = null;

        if (!(sig instanceof MethodSignature)){
            throw new IllegalArgumentException("該註解只能用於方法");
        }
        msig = (MethodSignature)sig;
        //獲取所有的參數信息
        Class [] parameterTypes = msig.getMethod().getParameterTypes();
        Object object = null;
        //獲得攔截的方法
        Method method = null;
        try{
            method = target.getClass().getMethod(methodName,parameterTypes);
        }catch (NoSuchMethodException e1){
            e1.printStackTrace();
        }catch (SecurityException e2){
            e2.printStackTrace();
        }
        if (null!=method){
            if (method.isAnnotationPresent(OperateLog.class)){
                //利用反射獲取註解的信息
                OperateLog operateLog = method.getAnnotation(OperateLog.class);
                String operateModule = operateLog.operatorModule();
                System.out.println(operateModule);
            }else{
                object = pjp.proceed();
            }
        }else{
            object = pjp.proceed();
        }
        return object;
    }

}

七、數據庫

這裏就沒有使用數據庫連接,而是使用map進行替代

package com.howen.db;

import com.howen.entity.Student;

import java.util.HashMap;
import java.util.Map;

public class DBConfig {
    public static Map<Integer,Student> studentDB = new HashMap<>();
}

八、applicationContext.xml需要配置掃描包、註解驅動、以及切面自動代理

 <!--掃描包-->
    <context:component-scan base-package="com.howen"/>
    <!--定義servlet-->
    <mvc:default-servlet-handler/>
    <!--允許使用註解形式-->
    <mvc:annotation-driven/>

    <aop:aspectj-autoproxy proxy-target-class="true"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章