Spring——Aop
aspect 静态织入
SpringAop 动态织入
- pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
- helloController
import com.spring.aop.aopdemo.LogAux;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@RestController
public class helloController {
//http://localhost:8080/hello?name=嘿嘿
@RequestMapping("/hello")
@ResponseBody
public String hello(@RequestParam("name") String name) {
return "hello---->" + name;
}
@RequestMapping("/hello1")
@ResponseBody
public String hello1(@RequestParam("name") String name, @RequestParam("age") String age) {
return "hello1---->name1--->" + name + " age--->" + age;
}
@RequestMapping("/hello2")
@ResponseBody
public String hello2(@RequestParam("name") String name, Model model) {
model.addAttribute("name", "塞姆黑林");
model.addAttribute("age", "嘻嘻哈哈哈");
return "hello1---->name1--->" + name ;
}
}
- LogAux
package com.spring.aop.aopdemo;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class LogAux {
public String LogName;
public String LogContext;
public String LogType;
}
- myAdvice
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Map;
@Aspect
@Component
public class myAdvice {
private Logger logger = LoggerFactory.getLogger(myAdvice.class);
//定义切点
@Pointcut(value = "execution(* com.spring.aop.aopdemo.controller.*.*(..))")
public void myPointCut() {
}
/**
* 环绕通知设置日志
*/
@Around("myPointCut()")
public Object myLogger(ProceedingJoinPoint pjp) {
String className = pjp.getTarget().getClass().toString();
String methodName = pjp.getSignature().getName();
Object[] args = pjp.getArgs();
ObjectMapper mapper = new ObjectMapper();
try {
logger.info("调用前:" + className + ":" + methodName + "传递的参数为:" + mapper.writeValueAsString(args));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
Object obj = null;
try {
obj = pjp.proceed();//调用目标去执行
} catch (Throwable throwable) {
throwable.printStackTrace();
}
try {
logger.info("调用后:" + className + ":" + methodName + "返回值:" + mapper.writeValueAsString(args));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return obj;
}
/**
* 获取request中参数
*
*/
@AfterReturning("myPointCut() && args(logname, logcontet)")
public void myLogger(String logname, String logcontet) {
LogAux logAux = new LogAux();
logAux.setLogContext(logcontet);
logAux.setLogName(logname);
// logAux.setLogType(logtype);
System.out.println("logAux = " + logAux);
}
@AfterReturning("myPointCut()")
public void myLogger(JoinPoint point) {
Object[] args = point.getArgs();
for (int i = 0; i < args.length; i++) {
System.out.println("args[i] = " + args[i]);
}
Map argsMap = (Map)args[1];
String logcontet = (String) argsMap.get("age");
String logname = (String) argsMap.get("name");
System.out.println("logcontet = " + logcontet);
System.out.println("logname = " + logname);
LogAux logAux = new LogAux();
logAux.setLogContext(logcontet);
logAux.setLogName(logname);
// logAux.setLogType(logtype);
System.out.println("logAux = " + logAux);
}
/* @Pointcut(value = "execution(* com.spring.aop.aopdemo.controller.*.*(..))")
public void pointcut() {}
@Before("pointcut() && args(data)")
public void doBefore(String data) throws NullPointerException {
logger.info("-----------------执行开始------------------------");
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("请求地址:" + request.getRequestURL());
logger.info("请求方式:" + request.getMethod().toUpperCase());
logger.info("切面之前打印日志:传入参数为:" + data);
}
@AfterReturning(returning = "ret", pointcut = "pointcut()")
public void doAfterReturning(String ret) {
if (ret != null) {// 记录返回结果
// log.info("切面执行接口之后打印日志:返回结果为:" + ret);}
// log.info("---------------执行结束------------------------------------");}}
}
}*/
}