国外做任务的网站,上海近期大事件,rap做词网站,新手如何学seo认识 Spring AOP 1.什么是 AOP2.AOP 中的概念3.用 AOP 方式管理日志3.1 编写 AOP 日志注解类3.2 编写控制器用于测试 1.什么是 AOP
AOP#xff08;Aspect Oriented Program#xff0c;面向切面编程#xff09;把业务功能分为核心、非核心两部分。
核心业务功能#xff1a… 认识 Spring AOP 1.什么是 AOP2.AOP 中的概念3.用 AOP 方式管理日志3.1 编写 AOP 日志注解类3.2 编写控制器用于测试 1.什么是 AOP
AOPAspect Oriented Program面向切面编程把业务功能分为核心、非核心两部分。
核心业务功能用户登录、增加数据、删除数据。非核心业务功能性能统计、日志、事务管理。
在 Spring 的面向切面编程AOP思想里非核心业务功能 被定义为 切面。核心业务功能和切面功能先被分别进行独立开发然后把切面功能和核心业务功能 编织 在一起这就是 AOP。 由此可见AOP 将业务无关却为业务模块所共同调用的逻辑封装起来以便减少系统的重复代码降低模块间的耦合度利于未来的拓展和维护。这正是 AOP 的目的它是 Spring 最为重要的功能之一被广泛使用。
2.AOP 中的概念
切入点pointcut在哪些类、哪些方法上切入。通知advice在方法前、方法后、方法前后做什么。切面aspect切面 切入点 通知。即在什么时机、什么地方、做什么。织入weaving把切面加入对象并创建出代理对象的过程。环绕通知AOP 中最强大、灵活的通知它集成了前置和后置通知保留了连接点原有的方法。
3.用 AOP 方式管理日志
下面通过实例演示如何用 AOP 方式管理日志。
3.1 编写 AOP 日志注解类
package com.example.demo.aop;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;/*** Description: 使之成为切面类*/
Aspect
/*** Description: 把切面类加入到IOC容器中*/
Component
public class AopLog {private Logger logger LoggerFactory.getLogger(this.getClass());//线程局部的变量,解决多线程中相同变量的访问冲突问题。ThreadLocalLong startTime new ThreadLocal();//定义切点Pointcut(execution(public * com.example..*.*(..)))public void aopWebLog() {}Before(aopWebLog())public void doBefore(JoinPoint joinPoint) throws Throwable {startTime.set(System.currentTimeMillis());// 接收到请求记录请求内容ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request attributes.getRequest();// 记录下请求内容logger.info(URL : request.getRequestURL().toString());logger.info(HTTP方法 : request.getMethod());logger.info(IP地址 : request.getRemoteAddr());logger.info(类的方法 : joinPoint.getSignature().getDeclaringTypeName() . joinPoint.getSignature().getName());//logger.info(参数 : Arrays.toString(joinPoint.getArgs()));logger.info(参数 : request.getQueryString());}AfterReturning(pointcut aopWebLog(),returning retObject)public void doAfterReturning(Object retObject) throws Throwable {// 处理完请求返回内容logger.info(应答值 : retObject);logger.info(费时: (System.currentTimeMillis() - startTime.get()));}//抛出异常后通知After throwing advice 在方法抛出异常退出时执行的通知。AfterThrowing(pointcut aopWebLog(), throwing ex)public void addAfterThrowingLogger(JoinPoint joinPoint, Exception ex) {logger.error(执行 异常, ex);}}Before在切入点开始处切入内容。After在切入点结尾处切入内容。AfterReturning在切入点 return 内容之后切入内容可以用来对处理返回值做一些加工处理。Around在切入点前后切入内容并自己控制何时执行切入点自身的内容。AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑。Aspect标记为切面类。Component把切面类加入到 IOC 容器中让 Spring 进行管理。
3.2 编写控制器用于测试
下面的控制器构造了一个普通的 Rest 风格的页面。
package com.example.demo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;RestController
public class AopLogController {GetMapping(/aoptest)public String aVoid(){return hello aop test;}
}启动项目访问 http://localhost:8080/aoptest。 在控制台会输出如下信息。