当前位置: 首页 > news >正文

如何做网站搜索栏超级营销型网站模板

如何做网站搜索栏,超级营销型网站模板,wordpress 5.2.2中文版,广告公司简历模板前言: 从事 Java 的小伙伴都知道 Spring AOP,也都知道 AOP 是面向切面编程,那你知道 AOP 在项目实战中怎么使用吗?本篇简单分享 Spring AOP 在项目中的实际使用。 AOP 知识储备传送门: 深入理解 Spring AOP 源码分析…

前言:

从事 Java 的小伙伴都知道 Spring AOP,也都知道 AOP 是面向切面编程,那你知道 AOP 在项目实战中怎么使用吗?本篇简单分享 Spring AOP 在项目中的实际使用。

AOP 知识储备传送门:

深入理解 Spring AOP 源码分析(附源码分析)

AOP 基础知识回顾

AOP 概念

  • 连接点(Join point):能够被拦截的地⽅、地点,Spring AOP 是基于动态代理的,所以是⽅法拦截的,每个成员⽅法都可以称之为连接点。
  • 切点(Poincut):匹配连接点的断言,在AOP中通知和一个切入点表达式关联,切点分为execution方式和annotation方式,前者可以用路径表达式指定哪些类织入切面,后者可以指定被哪些注解修饰的代码织入切面。
  • 通知(Advice):在切面的某个特定的连接点上执行的动作,通知分为:前置通知、后置通知、异常通知、最终通知、环绕通知(切面要完成的功能)。
  • 织⼊(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象,分为:编译时织入、类加载时织入、执行时织入
  • 引⼊/引介(Introduction):允许我们向现有的类添加新⽅法或属性,是⼀种特殊的增强。
  • 切面(Aspect):切⾯由切点和增强、通知组成,它既包括了横切逻辑的定义、也包括了连接点的定义。

通知(Advice)分类

  • 前置通知(Before Advice):在⽬标⽅法被调⽤前的通知功能。
  • 后置通知(After Advice):在⽬标⽅法被调⽤之后的通知功能。
  • 返回通知(After-returning):在⽬标⽅法成功执⾏之后的通知功能。
  • 异常通知(After-throwing):在⽬标⽅法抛出异常之后的通知功能。
  • 环绕通知(Around):把整个⽬标⽅法包裹起来,在被调⽤前和调⽤之后的通知功能。

自定义 AOP 切面常用知识储备

@Aspect 注解的作用?

@Aspect 注解的作用是定义一个切面,需要再自定义切面类上加上次注解。

@Component 注解

@Component 注解表示这个类交给 Spring 容器管理,如果不使用 @Component 注解,也要以其他方法是注册切面类,以确保 Spring 容器能够识别并管理这个切面。

Pointcut 切点中 execution 和 @annotation 定义切面的区别?

  • @annotation:切点表达式是注解的全限类名,是根据注解来匹配的,有注解的方法才会被拦截。

  • execution:切点表达式很灵活,有修饰符匹配、返回值匹配、类路径匹配、方法名匹配、参数匹配、异常类型匹配。

  • 作用于任意以 public 修饰的方法:execution(public * *(…))

  • 作用于任何一个以 set 开始的方法:execution(* set*(…))

  • 作用于 MyService 接口的任意方法:execution(* com.xxx.service.MyService.*

  • 作用于定义在 service 包和所有子包里的任意类的任意方法:execution(* com.xxx.service….(…)),第一个 * 表示匹配任意的方法返回值, …(两个点)表示零个或多个,第一个 … 表示 service 包及其子包,第二个 * 表示所有类,第三个 * 表示所有方法,第二个…表示方法的任意参数个数。

JoinPoint 的作用?

PoinPoint 代表程序中的一个点,通常把 JoinPoint 作为一个参数传递到通知方法中,通过 JoinPoint 来获取程序中这个点的相关信息,JoinPoint 只能用于 @Before、@After、@AfterReturning、@AfterThrowing 通知中,不能使用于 @Around 中,JoinPoint 常用方法如下:

  • Object[] getArgs():返回目标方法的参数。
  • Signature getSignature():返回方法的签名。
  • Object getTarget():返回被增强的目标对象,也就是被代理对象。
  • Object getThis():返回由目标对象生成的代理对象。

ProceedingJoinPoint 的作用?

ProceedingJoinPoint 是 JoinPoint 的子接口,用于环绕通知 @Around 中,它提供了一个 proceed() 方法,用于执行被拦截的方法也就是目标方法。

自定义 AOP 切面代码演示

自定义 AOP 切面实现接口请求日志记录

记录接口请求日志这种业务场景是非常常见的,如果在每个接口中去记录,显得代码臃肿且不灵活,而且有很大的侵入性,我们可以使用自定义 AOP 面来完成这种功能,代码如下:

@Slf4j
@Component
@Aspect
public class MyApiLogAspect implements Ordered {@Pointcut("execution(* com.my.study.controller..*(..))")public void logPointCut() {}@Around("logPointCut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis();//获取当前请求对象ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();//记录请求日志信息ApiLogVO apiLogDO = new ApiLogVO();MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Method method = methodSignature.getMethod();String methodName = method.getName();apiLogDO.setMethodName(methodName);apiLogDO.setRequestMethod(request.getMethod());apiLogDO.setMethodParameters(getParameter(method, joinPoint.getArgs()));apiLogDO.setUri(request.getRequestURI());//执行目标方法Object result = joinPoint.proceed();apiLogDO.setResponse(result);long endTime = System.currentTimeMillis();apiLogDO.setTimeConsuming((endTime - startTime));log.info("请求日志信息:{}", JSON.toJSONString(apiLogDO));return result;}/*** 根据方法和传入的参数获取请求参数*/private Object getParameter(Method method, Object[] args) {List<Object> argList = new ArrayList<>();Parameter[] parameters = method.getParameters();for (int i = 0; i < parameters.length; i++) {//将RequestBody注解修饰的参数作为请求参数RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class);if (requestBody != null) {argList.add(args[i]);}//将RequestParam注解修饰的参数作为请求参数RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class);if (requestParam != null) {Map<String, Object> map = new HashMap<>();String key = parameters[i].getName();if (ObjectUtil.isNotEmpty(requestParam.value())) {key = requestParam.value();}map.put(key, args[i]);argList.add(map);}}if (argList.size() == 0) {return null;} else if (argList.size() == 1) {return argList.get(0);} else {return argList;}}@Overridepublic int getOrder() {return -1;}
}@Data
public class ApiLogVO {@ApiModelProperty("方法名称")private String methodName;@ApiModelProperty("请求方式")private String requestMethod;@ApiModelProperty("方法路径")private String uri;@ApiModelProperty("方法耗时")private Long timeConsuming;@ApiModelProperty("方法参数")private Object methodParameters;@ApiModelProperty("方法响应")private Object response;}

从代码来看,我们使用了很少的代码量完成了接口请求日志的记录,而且没有入侵业务代码,Pointcut 支持各种灵活配置,可以丰富我们记录各种场景,因为记录了接口出入参及请求时间,因此我们使用的是环绕通知。

自定义 AOP 切面实现接口鉴权

在业务项目开发中,部分接口需要进行权限校验,部分接口不需要进行权限校验,这也是一种非常常见的场景,我们如果在每个接口中去做判断同样显得代码臃肿且入侵业务代码,我们同样可以通过自定义注解 + AOP 切面的方式完成接口鉴权的功能,代码如下:

@Component
@Slf4j
@Aspect
public class MyAuthLogAspect implements Ordered {@Resourceprivate AuthUtil authUtil;@Pointcut("@annotation(com.com.my.study.annotation.RequiresPermissions)")public void authPointCut() {}@Before("authPointCut()")public void before(JoinPoint joinPoint) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 注解鉴权 有注解表示需要鉴权RequiresPermissions requiresPermissions = signature.getMethod().getAnnotation(RequiresPermissions.class);if (requiresPermissions != null) {authUtil.checkPermission(requiresPermissions);}}@After("authPointCut()")public void after(JoinPoint joinPoint) {}@Overridepublic int getOrder() {//优先级最高  值越小 越先执行return 1;}
}

通过代码可以看出通过自定义 AOP 切面完成接口权限校验也是十分简单方便,因为是进行接口权限校验,我们使用前置通知即可完成接口权限校验的功能。

自定义 AOP 切面执行顺序

当项目中有多个切面的时候,我们该如何保证切面的执行顺序?我们可以通过实现 Order 接口来自定义切面的执行顺序,order 的值越小,对应的切面的优先级就越高,也就越先执行。

自定义 AOP 切面的使用场景

  • 接口日志记录。
  • 权限校验。
  • 接口限流。
  • 。。。。。。

欢迎提出建议及对错误的地方指出纠正。

http://www.yayakq.cn/news/959236/

相关文章:

  • 企业官网网站模板下载人气最旺的微信公众号
  • 新手php网站建设网站建设从入门到精通pdf
  • 做网站 江门亿网正品
  • 国家摄影网站搜索引擎有哪些软件
  • 一站式网络推广服务百度网址导航主页
  • 用php做的大型网站html网站开发代码
  • 专业做外贸网站的公司十大咨询公司排行榜
  • 广州培训网站开发vs做网站连数据库
  • 灰色关键词排名技术北京seo优化厂家
  • 响应式设计网站织梦做网站也是模板吗
  • 企业的网站特点长春火车站位置
  • 成都 商业网站建设网站制作吧
  • 2017年网站建设视频教程最好用的免费建站平台
  • wordpress 主题颜色百度地图排名怎么优化
  • 外贸建站模板下载网站如何添加白名单
  • 网站建设策划书范文案例扬中富裕吗
  • 网站推广营销公司网站公司文化怎么做
  • 河源网站制作1993seo优秀毕业设计网站设计
  • kali做钓鱼网站制作app公司
  • 台州专业制作网站山东青岛网站设计公司
  • 网站后台密码怎么改免费做自己的网站有钱赚吗
  • 建网站的费用是多少什么网站系统做的最好
  • 英文网站建设优化com网站建设中
  • 湖州企业网站开发公司wordpress自带分页函数
  • 做风帆网站需要多少钱做网站遇到竞争对手怎么办
  • 动易网站 设置背景图片seo网站关键词排名快速
  • 建立一个网站需要多少钱?软件开发工程师职业分析
  • 西宁建设工程信息网站pc网站开发制作
  • 苏州 规划建设局网站建设通和天眼查网站
  • 建站计划书北京谁会做网站开发