SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数

时间:2022-11-24 07:49:19

SpringBoot使用AOP统一处理请求日志

这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理。首先在pom.xml中引入我们需要的aop的jar包

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后我们新建一个Aspect去对我们的所有Controller进行一个日志拦截。在SPringBoot中我们使用AOP也是很简单的,只需要在类上加上一个@Aspect的注解就好了,然后通过@Component注解到我们的Spring容器中去。
我们新建一个包com.majiaxueyuan.log专门用来放我们的日志记录,代码如下:

@Aspect
@Component
@Slf4j
public class MjxyLogAspect {
 //第一个 * 号表示任意返回类型,第二个 * 号表示Person的所有方法
@Pointcut("execution(public * com.majiaxueyuan.controller..*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
log.info("URL : " + request.getRequestURL().toString());
log.info("HTTP_METHOD : " + request.getMethod());
log.info("IP : " + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
log.info("name:{},value:{}", name, request.getParameter(name));
}
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
log.info("RESPONSE : " + ret);
}
}

然后我们通过浏览器随便请求一次,可以看到控制台输出,这里我们就可以在实际生产环境中存储日志。
SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数

SpringBoot定时任务@Scheduled

在service中新建一个类ScheduledTest,代码如下:

@Component
public class ScheduledTest {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Scheduled(fixedRate = 2000)
public void scheduled() {
System.out.println("码家学院提示你==》现在时间:" + dateFormat.format(new Date()));
}
}

另外我们需要在主函数启动类上开启定时器

@SpringBootApplication
@EnableScheduling
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

SpringBoot异步调用Async

这个和定时器差不多,启动加上@EnableAsync ,只需要在我们需要异步的方法上面加上@Async注解
异步就是在主线程中部分代码执行另一个线程,而另一个线程不影响主线程的执行。

AsyncTest.java

@Component
public class AsyncTest{
 	@Async
 	public void asyncOut(){
		sout(Thread.currentThread().geetId());
	}
}

启动类中

@SpringBootApplication
@EnableAsync
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@RequestMapping("/login")
public String login(){
sout(Thread.currentThread().getId());
asyncTest.asyncOut();
return "loginPage"
}

运行的结果发现两个id是不同的,说明成功了。

自定义参数

在配置文件中我们可以去在配置文件中自定义一些参数,比如:

name=majiaxueyuan

我们在代码中获取到我们的这个配置文件

@Value("${name}")
private String name;
@ResponseBody
@RequestMapping("/getValue")
public String getValue() {
return name;
}