一、依賴包導入
除了需要導入相關的spring
的包,還要添加三個jar
包。aopalliance
、aspectjrt
、aspectjweaver
。在這裏我導入的是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"/>