一文吃透 Spring 中的 AOP 编程
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:SSM 框架从入门到精通
✨特色专栏:国学周更-心性养成之路
🥭本文内容:一文吃透 Spring 中的 AOP 编程
文章目录
- AOP 概述
- AOP 实现分类
- AOP 术语
- 基于 Aspectj 实现 AOP 操作
- 第一版:基于xml(aop:config)配置文件
- 第二版:基于xml(aop:aspect)配置文件
- 第三版:基于注解实现通知
AOP 概述
AOP 为 Aspect Oriented Programming 的缩写,是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型
AOP 可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理。JDK 动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口
AOP 实现分类
AOP 要达到的效果是,保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能,按照 AOP 框架修改源代码的时机,可以将其分为两类:
- 静态 AOP 实现, AOP 框架在编译阶段对程序源代码进行修改,生成了静态的 AOP 代理类(生成的 *.class 文件已经被改掉了,需要使用特定的编译器),比如 AspectJ。
- 动态 AOP 实现, AOP 框架在运行阶段对动态生成代理对象(在内存中以 JDK 动态代理,或 CGlib 动态地生成 AOP 代理类),如 SpringAOP
AOP 术语
-
连接点(JointPoint):与切入点匹配的执行点,在程序整个执行流程中,可以织入切面的位置,方法的执行前后,异常抛出的位置
-
切点(PointCut):在程序执行流程中,真正织入切面的方法。
-
切面(ASPECT):切点+通知就是切面
-
通知(Advice):切面必须要完成的工作,也叫增强。即,它是类中的一个方法,方法中编写织入的代码。
前置通知 后置通知
环绕通知 异常通知
最终通知 -
目标对象(Target):被织入通知的对象
-
代理对象(Proxy):目标对象被织入通知之后创建的新对象
通知的类型
Spring 方面可以使用下面提到的五种通知工作:
通知 | 描述 |
---|---|
前置通知 | 在一个方法执行之前,执行通知。 |
最终通知 | 在一个方法执行之后,不考虑其结果,执行通知。 |
后置通知 | 在一个方法执行之后,只有在方法成功完成时,才能执行通知。 |
异常通知 | 在一个方法执行之后,只有在方法退出抛出异常时,才能执行通知。 |
环绕通知 | 在一个方法调用之前和之后,执行通知。 |
基于 Aspectj 实现 AOP 操作
基于 Aspectj 实现 AOP 操作,经历了下面三个版本的变化,注解版是我们最常用的。
切入点表达式
作用:声明对哪个类中的哪个方法进行增强
语法:
execution([访问权限修饰符] 返回值 [ 类的全路径名 ] 方法名 (参数列表)[异常])
-
访问权限修饰符:
可选项,不写就是四个权限都包含
写public就表示只包括公开的方法
-
返回值类型
必填项 * 标识返回值任意
-
全限定类名
可选项,两个点 … 表示当前包以及子包下的所有类,省略表示所有类
-
方法名
必填项 * 表示所有的方法 set*表示所有的set方法
-
形参列表
必填项
()表示没有参数的方法
(…)参数类型和参数个数随意的方法
(*)只有一个参数的方法
(*,String) 第一个参数类型随意,第二个参数String类型
-
异常信息
可选项 省略时标识任何异常信息
第一版:基于xml(aop:config)配置文件
使用 Spring AOP 接口方式实现 AOP, 可以通过自定义通知来供 Spring AOP 识别对应实现的接口是:
- 前置通知:MethodBeforeAdvice
- 返回通知:AfterReturningAdvice
- 异常通知:ThrowsAdvice
- 环绕通知:MethodInterceptor
实现步骤:
1、定义业务接口
/*** 使用接口方式实现AOP, 默认通过JDK的动态代理来实现. 非接口方式, 使用的是cglib实现动态代理*/package cn.kgc.spring05.entity;public interface Teacher {String teachOnLine(String course);String teachOffLine(Integer course);
}
2、定义实现类
package cn.kgc.spring05.entity;public class TeacherA implements Teacher{@Overridepublic String teachOnLine(String course) {System.out.println("TeacherA开始"+course+"课程线上教学");if(course.equals("java")){throw new RuntimeException("入门到放弃!");}return course+"课程线上教学";}@Overridepublic String teachOffLine(Integer course) {System.out.println("TeacherA开始"+course+"课程线下教学");return course+"课程线下教学";}
}
3、实现接口定义通知类
前置通知类
package cn.kgc.spring05.advice;import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;//前置通知
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] objects, Object o) throws Throwable {System.out.println("------------spring aop 前置通知------------");}
}
后置通知类
package cn.kgc.spring05.advice;import org.springframework.aop.AfterReturningAdvice;import java.lang.reflect.Method;public class MyAfterReturnAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {System.out.println("------------spring aop 后置通知------------");}
}
4、XML 配置方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><!--托管通知--><bean id="after" class="cn.kgc.spring05.advice.MyAfterReturnAdvice"></bean><bean id="before" class="cn.kgc.spring05.advice.MyMethodBeforeAdvice"></bean><bean id="teacherA" class="cn.kgc.spring05.entity.TeacherA"></bean><!--AOP的配置--><aop:config><!--切点表达式--><aop:pointcut id="pt" expression="execution(* *(..))"/><aop:advisor advice-ref="before" pointcut-ref="pt"></aop:advisor><aop:advisor advice-ref="after" pointcut-ref="pt"></aop:advisor></aop:config>
</beans>
5、测试
package cn.kgc.spring05;import cn.kgc.spring05.entity.Teacher;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** Unit test for simple App.*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-config.xml")
public class AppTest
{@AutowiredTeacher teacher;@Testpublic void teachOnLine() {System.out.println(teacher.getClass());String s = teacher.teachOnLine("java");System.out.println("s = " + s);}
}
6、运行结果
第二版:基于xml(aop:aspect)配置文件
基于 xml(aop:config) 配置文件的方式,增加几个通知,就会创建几个通知类,那我们能否将这些通知类写在一个类中呢?下面就让我来带你们找到解决之法!
配置 AspectJ 标签解读表
实现步骤:
1、定义业务接口
/*** 使用接口方式实现AOP, 默认通过JDK的动态代理来实现. 非接口方式, 使用的是cglib实现动态代理*/package cn.kgc.spring05.entity;public interface Teacher {String teachOnLine(String course);String teachOffLine(Integer course);
}
2、定义实现类
package cn.kgc.spring05.entity;public class TeacherA implements Teacher{@Overridepublic String teachOnLine(String course) {System.out.println("TeacherA开始"+course+"课程线上教学");if(course.equals("java")){throw new RuntimeException("入门到放弃!");}return course+"课程线上教学";}@Overridepublic String teachOffLine(Integer course) {System.out.println("TeacherA开始"+course+"课程线下教学");return course+"课程线下教学";}
}
3、实现接口定义通知类
package cn.kgc.spring05.advice;public class AllAdvice {public void before(){System.out.println("------------前置通知--------------");}public void afterReturning(){System.out.println("------------后置通知--------------");}public void afterThrowing(){System.out.println("------------异常通知--------------");}public void after(){System.out.println("------------最终通知--------------");}public void around(){System.out.println("------------环绕通知--------------");}
}
4、XML 配置方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><!--托管通知--><bean id="all" class="cn.kgc.spring05.advice.AllAdvice"></bean><bean id="teacherA" class="cn.kgc.spring05.entity.TeacherA"></bean><!--AOP的配置--><aop:config><!--切点表达式--><aop:pointcut id="pt" expression="execution(* *(String))"/><aop:aspect ref="all"><aop:before method="before" pointcut-ref="pt"></aop:before><aop:after-returning method="afterReturning" pointcut-ref="pt"></aop:after-returning><aop:after-throwing method="afterThrowing" pointcut-ref="pt"></aop:after-throwing><aop:after method="after" pointcut-ref="pt"></aop:after>
<!-- <aop:around method="around" pointcut-ref="pt"></aop:around>--></aop:aspect></aop:config>
</beans>
5、测试
package cn.kgc.spring05.advice;import cn.kgc.spring05.entity.Teacher;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-config2.xml")
public class AllAdviceTest{@AutowiredTeacher teacher;@Testpublic void test01() {System.out.println(teacher.getClass());String s = teacher.teachOnLine("java");System.out.println("s = " + s);}
}
6、运行结果
第三版:基于注解实现通知
- 常用 “通知” 注解如下:
@Aspect 注解将此类定义为切面。
@Before 注解用于将目标方法配置为前置增强(前置通知)。
@AfterReturning 注解用于将目标方法配置为后置增强(后置通知)。
@Around 定义环绕增强(环绕通知)
@AfterThrowing 配置异常通知
@After 也是后置通知,与 @AfterReturning 很相似,区别在于 @AfterReturning 在方法执行完毕后进行返回,可以有返回值。@After 没有返回值。
实现步骤:
1、定义业务接口
/*** 使用接口方式实现AOP, 默认通过JDK的动态代理来实现. 非接口方式, 使用的是cglib实现动态代理*/package cn.kgc.spring05.entity;public interface Teacher {String teachOnLine(String course);String teachOffLine(Integer course);
}
2、定义注解
package cn.kgc.spring05.advice;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoAdvice {
}
3、定义实现类
package cn.kgc.spring05.entity;import cn.kgc.spring05.advice.AnnoAdvice;
import org.springframework.stereotype.Component;@Component
public class TeacherA implements Teacher{@Override@AnnoAdvicepublic String teachOnLine(String course) {System.out.println("TeacherA开始"+course+"课程线上教学");if(course.equals("java")){throw new RuntimeException("入门到放弃!");}return course+"课程线上教学";}@Override@AnnoAdvicepublic String teachOffLine(Integer course) {System.out.println("TeacherA开始"+course+"课程线下教学");return course+"课程线下教学";}
}
4、实现接口定义切面类
首先在类上面添加 @Aspect 注解,将该类转化为切面类,再在类中的各个方法上面使用各自的 “通知” 注解即可实现。
package cn.kgc.spring05.advice;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component
@Aspect
public class AllAdvice {@Pointcut("@annotation(AnnoAdvice)")public void point(){}@Before("point()")public void before(){System.out.println("------------前置通知--------------");}@AfterReturning("point()")public void afterReturning(){System.out.println("------------后置通知--------------");}@AfterThrowing("point()")public void afterThrowing(){System.out.println("------------异常通知--------------");}@After("point()")public void after(){System.out.println("------------最终通知--------------");}@Around("point()")public Object aroundAdvice(ProceedingJoinPoint joinPoint){Object proceed = null;try {System.out.println("----------spring aop 环绕 前通知-----------");proceed = joinPoint.proceed();System.out.println("----------spring aop 环绕 后通知-----------");} catch (Throwable throwable) {throwable.printStackTrace();System.out.println("----------spring aop 环绕 异常通知-----------");}finally {System.out.println("----------spring aop 环绕 最终通知-----------");}return proceed;}
}
5、XML 配置方式
开启包扫描和aspectj自动代理
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启包扫描--><context:component-scan base-package="cn.kgc.spring05"></context:component-scan><!--开启aspectj自动代理--><aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
6、测试
package cn.kgc.spring05.advice;import cn.kgc.spring05.entity.Teacher;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-config3.xml")
public class AllAdviceTest{@AutowiredTeacher teacher;@Testpublic void test01() {System.out.println(teacher.getClass());String s = teacher.teachOnLine("html");System.out.println("s = " + s);}
}
7、运行效果
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。
相关文章:
一文吃透 Spring 中的 AOP 编程
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit
如果你对智能家居有所了解,那应该或多或少听人聊起过 HomeKit。由 Apple 开发并主推的的 HomeKit 既因为产品选择少、价格高而难以成为主流,又因其独特的优秀体验和「出身名门」而成为智能家居领域的焦点。HomeKit 究竟是什么?能做什么&#…...
SpringCloud系列知识快速复习 -- part 1(SpringCloud基础知识,Docker,RabbitMQ)
SpringCloud知识快速复习SpringCloud基础知识微服务特点SpringCloud常用组件服务拆分和提供者与消费者概念Eureka注册中心原理Ribbon负载均衡原理负载均衡策略饥饿加载Nacos注册中心服务分级存储模型权重配置环境隔离Nacos与Eureka的区别Nacos配置管理拉取配置流程配置热更新配…...
2023上半年北京/上海/广州/深圳NPDP产品经理认证报名
产品经理国际资格认证NPDP是国际公认的唯一的新产品开发专业认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年…...
面试半年,总结了1000道2023年Java架构师岗面试题
半年前还在迷茫该学什么,怎样才能走出现在的困境,半年后已经成功上岸阿里,感谢在这期间帮助我的每一个人。 面试中总结了1000道经典的Java面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类…...
通过MySQL驱动拦截器实现执行sql耗时计算
文章目录背景具体实现MySQL5MySQL6MySQL8使用方法测试结果背景 公司的一个需求,公司既有的链路追踪日志组件要支持MySQL的sql执行时间打印,要实现链路追踪常用的手段就是实现第三方框架或工具提供的拦截器接口或者是过滤器接口,对于MySQL也不…...
易基因|独家分享:高通量测序后的下游实验验证方法——DNA甲基化篇
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。此前,我们分享了DNA甲基化研究的测序数据挖掘思路(点击查看详情),进而鉴定出研究的目的基因或目标区域的DNA甲基化。做完测序后,…...
java基础系列(七) 同步和异步理解
一. 问题描述 同步传输和异步传输是web和数据库的重要知识点,会被很多老师强调。那么,它们有什么相同点和不同点?它们对于我们学习编程的意义在哪里? 二. 概念 首先什么是同步和异步? 这里的同步是指&…...
吉林大学 程序设计基础 2022级 OJ期末考试 2.23
本人能力有限,发出只为帮助有需要的人。 以下为实验课的复盘,内容会有大量失真,请多多包涵。 1.双手剑士的最优搭配 每把剑有攻击力和防御力两个属性。双手剑士可以同时拿两把剑,其得到攻击力为两把剑中的攻击力的最大值&#…...
【项目实战】SpringMVC拦截器实战 - 自定义拦截器防止重复提交
一、背景说明 如何能够实现防止重复提交呢?以下是一种可选的方式。 二、代码实战 2.1 注册重复提交拦截器到SpringMVC中 @Configuration @AllArgsConstructor public class ResourcesConfig implements WebMvcConfigurer {private final RepeatSubmitInterceptor repeatSu…...
C++ STL:容器 Container
文章目录1、序列容器1.1、容器共性1.2、vectorvector 结构* vector 扩容原理* vector 迭代器失效1.3、dequedeque 结构deque 迭代器deque 模拟连续空间1.4、listlist 特殊操作list 结构list 迭代器2、关联式容器2.1、容器共性2.2、容器特性3、无序关联式容器3.1、容器共性3.2、…...
urllib之urlopen和urlretrieve的headers传入以及parse、urlparse、urlsplit的使用
urllib库是什么?urllib库python的一个最基本的网络请求库,不需要安装任何依赖库就可以导入使用。它可以模拟浏览器想目标服务器发起请求,并可以保存服务器返回的数据。urllib库的使用:1、request.urlopen(1)只能传入url的方式from http.clie…...
【C++】二叉搜索树的模拟实现
一、概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别…...
HNU工训中心:元器件及测量基础实验报告
工训中心的牛马实验 1.实验目的 1.熟悉测量验证常用元器件参数、 并采用替代法(测量回路电流)测量其伏安特性的方法。 2.熟悉测量误差及减小测量误差注意事项 2.实验仪器和器材 1.实验仪器. 直流稳压电源型号:IT6302 台式多用表型号:UT805A 2.实验( 箱)器材 电路实验箱…...
博客系统--自动化测试
项目体验地址(账号:123,密码:123)http://120.53.20.213:8080/blog_system/login.html项目后端说明:http://t.csdn.cn/32Nnv项目码云Gitee地址:https://gitee.com/GoodManSS/project/tree/master…...
Day903.自增主键不能保证连续递增 -MySQL实战
自增主键不能保证连续递增 Hi,我是阿昌,今天学习记录的是关于自增主键不能保证连续递增的内容。 MySql保证了主键是自增,但不相对连续;帮助开发人员快速识别每个行的唯一性,并提高查询效率。 自增主键可以让主键索引…...
02-MyBatis查询-
文章目录Mybatis CRUD练习1,配置文件实现CRUD1.1 环境准备Debug01: 别名mybatisx报错1.2 查询所有数据1.2.1 编写接口方法1.2.2 编写SQL语句1.2.3 编写测试方法1.2.4 起别名解决上述问题1.2.5 使用resultMap解决上述问题1.2.6 小结1.3 查询详情1.3.1 编写接口方法1.…...
外盘国际期货招商:2023年3月关注日历,把握重要投资机会
2023年3月大事件日历 关注大事日历,把握重要投资机会 3月1日:马斯克推出特斯拉宏图第三篇章 3月1-2日:G20外长会议 3月4-5日:全国两会召开 3月9日:中国2月CPI、PPI数据 待定(前次进行日期:…...
Linux学习(9.1)文件系统的简单操作
以下内容转载自鸟哥的Linux私房菜 原文:鸟哥的 Linux 私房菜 -- Linux 磁盘与文件系统管理 (vbird.org) 磁盘与目录的容量 df:列出文件系统的整体磁盘使用量;du:评估文件系统的磁盘使用量(常用在推估目录所占容量) df du 实体…...
Hadoop综合案例 - 聊天软件数据
目录1、聊天软件数据分析案例需求2、基于Hive数仓实现需求开发2.1 建库2.2 建表2.3 加载数据2.4 ETL数据清洗2.5 需求指标统计---都很简单3、FineBI实现可视化报表3.1 FineBI介绍3.2 FineBI配置数据3.3 构建可视化报表1、聊天软件数据分析案例需求 MR速度慢—引入hive 背景&a…...
Python进阶-----面向对象1.0(对象和类的介绍、定义)
目录 前言: 面向过程和面向对象 类和对象 Python中类的定义 (1)类的定义形式 (2)深层剖析类对象 前言: 感谢各位的一路陪伴,我学习Python也有一个月了,在这一个月里我收获满满…...
天猫淘宝企业服务为中小微企业打造供应链智能协同网络,让采购不再将就!丨爱分析报告
编者按:近日天猫淘宝企业服务&爱分析联合发布《2023中小微企业电商采购白皮书》,为中小微企业采购数字化带来红利。 某水泵企业:线上客户主要是中小微企业,线上业绩遇到瓶颈,如何突破呢?某焊割设备企业…...
基于四信网络摄像机的工业自动化应用
方案背景 随着数控机床被广泛的应用在工业生产中,数控技术发展成为制造业的核心。 鉴于数控机床的复杂性,以及企业人力储备有限,设备的监控和维护必须借助外部力量,而如何实现车间实时监测成了目前迫切解决的问题。 方案需求 ①兼…...
软件测试2
一 web掐断三大核心技术 HTML:负责网页的结构 CSS:负责网页的美化 JS:负责网页的行为 二 工具的使用 改变HBuilder文字的大小: 工具-视觉主题设置-大小22-确定 三 html简介 中文定义:超文本标记语言 新建一个html…...
(二分查找)leetcode162. 寻找峰值
文章目录一、题目1、题目描述2、基础框架3、原题链接二、解题报告1、思路分析2、时间复杂度3、代码详解三、本题小知识一、题目 1、题目描述 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值…...
spring boot 配合element ui vue实现表格的批量删除(前后端详细教学,简单易懂,有手就行)
目录 一.前言: 二. 前端代码: 2.1.element ui组件代码 2.2删除按钮 2.3.data 2.4.methods 三.后端代码: 一.前言: 研究了其他人的博客,找到了一篇有含金量的,进行了部分改写实现前后端分离࿰…...
hiveSQL开窗函数详解
hive开窗函数 文章目录hive开窗函数1. 开窗函数概述1.1 窗口函数分类1.2 窗口函数和普通聚合函数的区别2. 窗口函数的基本用法2.1 基本用法2.2 设置窗口的方法2.2.1 window_name2.2.2 partition by2.2.3 order by 子句2.2.4 rows指定窗口大小窗口框架2.3 开窗函数中加 order by…...
深度学习基础实例与总结
一、神经网络 1 深度学习 1 什么是深度学习? 简单来说,深度学习就是一种包括多个隐含层 (越多即为越深)的多层感知机。它通过组合低层特征,形成更为抽象的高层表示,用以描述被识别对象的高级属性类别或特征。 能自生成数据的中…...
在 WIndows 下安装 Apache Tinkerpop (Gremlin)
一、安装 JDK 首先安装 Java JDK,这个去官网下载即可,我下载安装的 JDK19(jdk-19_windows-x64_bin.msi),细节不赘述。 二、去 Tinkerpop 网站下载 Gremlin 网址:https://tinkerpop.apache.org/ 点击下面…...
从软件的角度看待PCI和PCIE(一)
1.最容易访问的设备是什么? 是内存! 要读写内存,知道它的地址就可以了,不需要什么驱动程序; volatile unsigned int *p 0xffff8811; unsigned int val; *p val; val *p;只有内存能这样简单、方便的使用吗…...
手机app网站模板下载/如何制作网站链接
这是一个完整的EasyJF论坛安装演示视频,主要演示EasyJF论坛从下载、安装、初始化几个部分,最后还对开源论坛的代码作了简单分析,适合Java新手观看。前两天做的一个EasyJF开源论坛安装视频演示,以前没录过这东西,要边操…...
竖排导航网站/今日新闻7月1日
经排查是因为虚拟机(Redis放在了虚拟机中)的防火墙没关 关闭方法-centos7 暂时关闭防火墙 systemctl stop firewalld查看防火墙状态 systemctl status firewalld绿点变灰点说明关闭...
wordpress主题插件免费/东莞seo优化推广
近日,有同事遇到一个奇怪问题:在开发环境,apache能正常支持中文文件下载,但切换到测试环境就404错误,找不文件,两个环境都是 Linux系统。我起先怀疑的是Linux下需要对apache进行配置,以支持中文…...
做捕鱼网站/建站seo推广
将创建一个 .NET Core 控制台应用,该应用使用 Entity Framework Core 对 SQLite 数据库执行数据访问。 先决条件 .NET Core SDK Visual Studio 2019版本16.3或更高版本 .NET Core跨平台开发 .NET 6.0运行时(LTS)和.NET Core 3.1运行时&am…...
如何做企业介绍/云速seo百度点击
2019独角兽企业重金招聘Python工程师标准>>> Redis的事务 是什么Redis的事务 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞噢:&…...
汾湖做网站/前端培训哪个机构靠谱
开始的想法源于netcore中通过lambd查询数据库后可以直接转为实体,所以试验在java中如何实现具体试验思路:利用现有数据库,定义一个获取车辆的api,调用获取车辆及司机信息1、现有车辆和司机模型车辆表(大概列一下,实际比这多)&…...