面试---简历

news2024/9/21 12:21:51

项目

1.1、商品管理

新增商品

同时插入商品对应的使用时间数据,需要操作两张表:product,product_usetime。在productService接口中定义save方法,该方法接受一张Dto对象,dto对象继承自product类,并将product_usetime的List集合作为成员属性。通过productService实现类的save方法,将dto对象保存至数据库。然后取出dto实体中的商品id,遍历Dto的元素类型为product_usetime的List集合,并将商品id赋给product_usetime对象,最后将product_usetime的集合存入数据库。

代码中使用了 @Transactional 注解,表示该方法应该在事务中执行,即保证整个方法的原子性,如果方法执行过程中出现异常,则会回滚已执行的操作。

商品分类查询

大致思路:构造分页对象,添加查询添加,例如根据name模糊查询还有排序条件,使用商品业务实现类的page方法进行分页查询,得到pageInfo对象,因为pageInfo的records字段存储的商品类中只有分类id,没有分类名称,因此用dto对象来替代records字段存储的商品类,dto类继承自商品类,并且将分类名称作为它的成员属性。

  • 因为商品中的分类名称为id值,要去分类表中根据id查询分类名称,因此要用SetmealDto数据传输对象(Data Transfer Object),Dto继承自商品类,并且有分类名称字段。
  • 构造分页对象,分别是商品分页构造器对象和商品Dto分页构造器对象。
  • 创建LambdaQueryWrapper对象,添加查询条件,根据name进行like模糊查询,添加排序条件,根据更新时间降序排列,调用商品业务实现类的page方法进行分页查询,得到pageInfo对象。
  • 对象拷贝,将pageInfo对象拷贝到dtoPage对象,但pageInfo对象的records列表的元素类型为商品类型,而我们需要的元素类型为商品Dto,因此records字段不需要被拷贝。
  • 为了使dtoPage的records列表字段的元素类型为商品Dto,我使用流式操作对pageInfo的records列表进行处理。具体处理为创建商品Dto对象,将商品对象拷贝到商品Dto对象,再根据分类id查询分类对象,然后将分类名称赋给SetmealDto对象。
  • 处理完成后,得到一个以商品Dto为元素类型的list集合,将该集合赋给dtoPage的records字段,最终将dtoPage对象返回给客户端即可。

1.2、订单管理

操作多张表,在service接口中扩展方法。
业务逻辑如下:
通过ThreadLocal获得用户id,根据用户id获得用户数据和购物车数据,根据客户端传来的收货地址查询地址数据,使用IdWorker.getId() 方法创建一个订单号。
对购物车数据创建一个Stream流,使用map方法对流中的每个元素进行映射操作,设置订单明细对象的值,并计算订单的总额,最终向订单明细表插入数据。
设置订单对象的值,其订单金额由上一步计算得来,最终向订单表插入数据。
最后删除购物车数据。

2、多线程

需求:根据商品表获取商品使用时间表。

  1. 使用单例设计模式创建 ThreadPoolExecutor 的单例线程池, 用于管理线程的执行。
  2. 据任务数量和线程池的队列大小来确定每个子任务的大小,确保每个子任务的大小不会超过线程池的队列大小。
  3. 创建一个 SynchroniseUtil 对象,参数为子任务的数量,用于同步子任务的执行。
  4. 使用一个循环遍历来划分任务列表 orders
  5. 创建一个 OrderTask 对象,该对象封装了子列表 orderVOSubList、用户列表 users 和同步器 synchroniseUtil
  6. 使用线程池的 execute 方法提交 OrderTask,使其在线程池中执行。
  7. Task 类实现了 Runnable 接口,并重写了 run() 方法。run() 方法是在子线程中执行的代码逻辑。其目的是获取对应商品的使用时间数据,并将使用时间数据添加到dto对象,该dto对象继承自商品对象,并且包含使用时间的字段。
  8. 处理结束后将结果添加到同步器 synchroniseUtil 中。
  9. 同步器 synchroniseUtil ,每个线程调用 addResult() 方法后都能将计数器的值减1,当所有线程都完成时,调用 get() 方法获取结果。
  10. SynchroniseUtil 在多线程场景中起到了同步线程并收集结果的作用。

3、AOP输出日志

4、SQL优化

  1. 为常作为查询条件的字段建立索引,where子句中的列,或者连接子句中指定的列

  2. 为经常需要排序、分组操作的字段建立索引

  3. 更新频繁字段不适合创建索引

  4. 不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)

  5. 对于定义为text、image和bit的数据类型的列不要建立索引,使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间

  6. 使用覆盖索引:创建覆盖索引,即索引包含查询所需的全部列,可以减少查询的IO操作,提高查询性能。

  7. 最左前缀原则,就是最左边的优先。指的是联合索引中,优先走最左边列的索引。对于多个字段的联合索引,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

  8. 非空字段:应该指定列为NOT NULL,除非你想存储NULL。

  9. 不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长

5、过滤器

拦截器和过滤器的区别:

过滤器能够对所有请求进行过滤处理,而拦截器通常只针对特定的控制器或控制器方法进行拦截。

  1. 执行时机:

    • 过滤器(Filter):在Servlet容器中,过滤器是最早执行的组件,它能够在请求进入Servlet容器之前进行处理,也能在响应返回客户端之前进行处理。
    • 拦截器(Interceptor):拦截器是在请求进入控制器(Controller)之前或之后进行处理的组件。
  2. 使用范围:

    • 过滤器(Filter):过滤器可以用于对所有的Servlet请求进行过滤处理,包括静态资源(如HTML、CSS、JavaScript文件)和动态请求(如Servlet请求)。
    • 拦截器(Interceptor):拦截器通常用于对控制器请求进行处理,即针对特定的控制器或控制器方法进行拦截。
  3. 所属技术框架:

    • 过滤器(Filter):过滤器是Servlet规范的一部分,与具体的框架无关,可用于任何基于Servlet容器的Web应用。
    • 拦截器(Interceptor):拦截器通常与特定的Web框架(如Spring MVC)或其他框架集成使用,依赖于框架提供的拦截器机制。

过滤器的实现:

  1. 通过@WebFilter注解将该类声明为一个过滤器,并指定过滤器应用于所有的URL路径("/*")。

  2. 实现Filter接口,并实现其中的doFilter方法,获取HttpServletRequestHttpServletResponse对象。通过request.getRequestURI()获取当前请求的URI路径。

  3. 定义一个包含不需要进行登录检查的请求路径数组urls,调用check方法,将urls数组和当前请求的URI进行匹配,判断本次请求是否需要进行登录检查。

  4. 如果不需要进行登录检查,则直接调用filterChain.doFilter(request, response)放行请求,将请求传递给目标资源。

  5. 如果需要进行登录检查,则判断是否登录,如果已登录,则将用户ID存入ThreadLocal对象中,然后调用filterChain.doFilter(request, response)放行请求。

  6. 如果未登录,则通过输出流的方式向客户端响应一个包含错误信息的JSON字符串,表示未登录状态。

6、全局异常

在全局异常处理器中,使用@ControllerAdvice注解标注该类,并通过annotations属性指定要增强的控制器类型为@RestController和@Controller,即RESTful风格的控制器和普通控制器。

使用@ResponseBody注解将方法的返回值直接作为响应体返回,而不需要额外的视图解析。

定义了一个异常处理方法 exceptionHandler,用于处理 SQL完整性约束冲突类型的异常。当捕获到该异常时,会执行该方法进行处理。

处理逻辑如下:

  1. 首先,使用日志记录异常信息。
  2. 判断异常信息中是否包含唯一约束条件,如果是,则表示出现了重复的条目,通过解析异常信息获取重复的条目值,并返回自定义错误信息。
  3. 如果异常信息中不包含唯一约束条件,则返回默认的未知错误信息。

技能

动态代理

  1. 简要解释动态代理:动态代理是一种在运行时创建代理对象的技术,通过代理对象可以在不修改原始对象的情况下拦截并增强方法的调用。

  2. 提及动态代理的两种类型:

  3. 基于接口的动态代理:基于接口的动态代理是通过Java的反射机制在运行时动态创建代理对象。该代理对象实现了目标接口,并将方法调用委托给实际的对象。我会提到java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口在基于接口的动态代理中的重要性。

  4. 基于类的动态代理:我会解释基于类的动态代理是通过继承和字节码操作在运行时动态创建代理对象。我会提到java.lang.reflect.Proxy类和java.lang.reflect.MethodInterceptor接口在基于类的动态代理中的作用。

  5. 动态代理的应用场景:我会提及动态代理的一些常见应用场景,如日志记录、事务管理、权限控制等。

Bean的生命周期管理

Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段:

Bean的实例化阶段: Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是singleton的是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化

Bean的初始化阶段: Bean创建之后还仅仅是个"半成品”,还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。Aop增强功能和Bean的循环引用问题都是在这个阶段体现的:

Bean的完成阶段: 经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池singletonObjects中去了,即完成了Spring Bean的整个生命周期。

设计模式

单例模式

是一种创建型设计模式,用于确保一个类只有一个实例,因此类的构造方法为private并且拥有一个当前类的静态成员变量,并提供对该实例的全局访问点,向外界再提供一个静态方法,向外界提供当前类的实例,当前类只能在内部实例化。序列号生成器、web页面计数器或者创建对象需要消耗较多资源时,可用单例模式。单例模式的最佳实践为无状态的,比如以工具类的形式提供。

项目实践:使用单例模式管理数据库连接对象,避免频繁地创建和销毁连接,提高性能和资源利用率。

懒汉式的双重检查锁:

代理模式

提供了一个代理对象作为另一个对象的替代,以控制对该对象的访问。代理对象充当原始对象的接口,可以提供额外的功能,如延迟初始化、访问控制或缓存。例如在分布式系统中,客户端通过代理对象访问远程服务,代理对象负责网络通信和数据传输。

项目实践:过滤器模式是代理模式的一种特殊情况,它通过代理对象对目标对象进行包装,以在目标对象的方法执行前后添加额外的处理逻辑。

观察者模式

定义了对象之间的一对多依赖关系。当一个对象(主题)的状态发生变化时,所有依赖对象(观察者)都会被通知并自动更新。这种模式实现了松耦合的通信,使对象能够对变化做出反应而无需紧密耦合在一起。例如在数据库系统中,触发器可以通过观察者模式实现,当数据库中的数据发生变化时触发相应的操作。

适配器模式

用于使具有不兼容接口的对象能够共同工作。它提供了一个适配器作为两个不兼容对象之间的桥梁,将它们的接口进行转换,以使它们能够协同工作。在不同的数据格式之间进行转换时,适配器模式可以提供一个统一的接口来适应不同的数据格式。

项目实践:对象映射器(Object Mapper)用于将Java对象与JSON之间进行转换。

Linux常用命令

  1. ls:列出当前目录的文件和子目录。
  2. cd:切换目录。
  3. pwd:显示当前所在的目录。
  4. mkdir:创建新的目录。
  5. rm:删除文件或目录。
  6. cp:复制文件或目录。
  7. mv:移动文件或目录。
  8. cat:查看文件内容。
  9. grep:在文件中查找指定的字符串。
  10. find:在文件系统中查找文件。
  11. chmod:修改文件或目录的权限。
  12. tar:打包和解压文件。
  13. ssh:远程登录到另一台计算机。
  14. wget:从网络下载文件。
  15. ps:查看当前运行的进程。
  16. kill:终止正在运行的进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习open62541 --- [78] 单线程和多线程的使用场景

open62541提供多线程功能&#xff0c;默认不开启&#xff0c;即单线程&#xff0c; 把UA_MULTITHREADING的值设置为 > 100就可以开启多线程了。 这里单线程/多线程的意思是基于open62541运行的server内部是否使用锁去保护数据。只要server运行后还有读写操作需要做&#x…

从源码全面解析 dubbo 消费端服务调用的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

3D 顶点着色与Phong 反射模型

Phong 反射模型有时被称为“Phong 照明”或“Phong 照明”。它由环境光照、漫反射&#xff08;朗伯反射&#xff09;、镜面反射三部分组成。 Phong 反射模型提供了一个方程式&#xff0c;用于计算表面上每个点的光照&#xff0c;I_p&#xff1a; 第一部分代表环境光项。在GLSL代…

X书hmac参数

被删重新发送 全文可以查看&#xff1a; 上面一遍unidbg解密shield文章 unidbg - 》 callObjectMethodV方法填写你的小红书路径下s.xml里的值: 或者在抓包响应头中: 查找xy-ter-str hmac 结果都是在&#xff0c;响应头里&#xff0c;所以 hmac 是服务器下发给客户端的. Over…

黑马头条.

文章目录 前言一、项目概述1.1 能收获什么1.2 项目概述1.3 项目术语1.4 业务说明 二、技术栈2.1技术栈整体框架图2.2技术栈简介 三、nacos环境搭建3.1 虚拟机镜像准备3.2 nacos的安装 四、初始工程搭建4.1 开发环境准备 五、实现登录功能5.1 需求分析5.2 表结构分析5.3 思路分析…

22道常见RocketMQ面试题以及答案

面试宝典到手&#xff0c;搞定面试&#xff0c;不再是难题&#xff0c;系列文章传送地址&#xff0c;请点击本链接。 1、RocketMQ是什么? 2、RocketMQ有什么作用&#xff1f; 3、RoctetMQ的架构 4、RoctetMQ的优缺点 8、消息过滤,如何实现&#xff1f; 9、消息去重,如果…

Elasticsearch 基本使用(四)聚合查询

聚合查询 概述单字段聚合查询统计分组后的数量非文档字段分组文档字段分组 其他聚合运算统计平均值统计总金额统计最大值自定义聚合结果排序简单聚合小结 多字段聚合查询 概述 说到聚合查询&#xff0c;马上会想到 SQL 中的 group by&#xff0c;ES中也有类似的功能&#xff0…

编程语言发展历史

文章目录 语言的发展时间轴语言世代时间轴1940年前-机器语言时代1940年后-汇编语言时代1950年-高级语言的初生1960年-高级语言的进一步成熟1980年-各大语言的进一步增强1990年代-飞速发展时代2000年-新时代 高级编程语言的分类解释型与编译型面向过程与面向对象 对语言的评价Ti…

【学习学习】NLP理解层次模型

NLP&#xff08;Neuro-Linguistic Programming&#xff0c;神经语言程序学&#xff09;&#xff0c;由两位美国人理查得.班德勒&#xff08;Richard Bandler&#xff09;与约翰.葛瑞德&#xff08;John Grinder&#xff09;于1976年创办&#xff0c;并在企业培训中广泛使用。美…

PyTorch 深度学习 || 4. 自编码网络 | Ch4.3 卷积自编码网络图像去噪

卷积自编码网络图像去噪 1. 数据的准备 先简单介绍一下训练网络使用到的图像数据集——STL10&#xff0c;该数据集可以通过torchvision.datasets模块中的STL10()函数进行下载&#xff0c;该数据集共包含三种类型数据,分别是带有标签的训练集和验证集&#xff0c;分别包含5000…

Cookie增删改查方法封装(低内存开销版)

本文章中的低内存开销是指在获取cookie的时候不进行字符串—>数组的转变&#xff0c;全程使用sliceindexOf切割字符串&#xff0c;不创建和操作数组&#xff0c;节约内存&#xff0c;本文代码已存放到github中&#xff0c;后续会持续完善功能&#xff0c;传送门&#xff1a;…

二进制方式部署kubernetes集群

二进制方式部署kubernetes集群 1、部署k8s常见的几种方式 1.1 kubeadm Kubeadm 是一个 k8s 部署工具&#xff0c;提供 kubeadm init 和 kubeadm join&#xff0c;用于快速部署 Kubernetes 集群。 Kubeadm 降低部署门槛&#xff0c;但屏蔽了很多细节&#xff0c;遇到问题很难…

掌握Python的X篇_4_开发工具ipython与vscode的安装使用

本篇将会介绍两个工具的安装及使用来提高Python的编程效率。 ipython&#xff1a;比python更好用的交互式开发环境vscode&#xff1a;本身是文本编辑器&#xff0c;通过安装相关的插件vscode可以作为python集中开发环境使用 掌握Python的X篇_4_开发工具ipython与vscode的安装使…

第四章 linux编辑器——vim的使用

第四章 linux编辑器——vim的使用 一、什么是vim&#xff1f;二、vim的基本操作1、模式之间的相互切换2、vim的常见命令集&#xff08;1&#xff09;正常模式的常见命令a. 模式切换b. 光标移动c.删除文字d.复制e.替换f.撤销g.更改 &#xff08;2&#xff09;底行模式的常见命令…

复习之linux的网络配置

一、基本定义 1.IP IP指网际互连协议&#xff0c;Internet Protocol的缩写&#xff0c;是TCP/IP体系中的网络层协议。 电脑之间要实现网络通信&#xff0c;就必须要有一个合法的ip地址。 IP地址网络地址主机地址&#xff08;又称&#xff1a;主机号和网络号组成&#xff09…

【MySQL】MyISAM中的索引方案

介绍 B树索引使用存储引擎如表所示&#xff1a; 索引/存储引擎MyISAMInnoDBMemoryB树索引支持支持支持 多个存储引擎支持同一种类型的索引&#xff0c;但是他们的实现原理是不同的。 InnoDB和MyISAM默认的索引是B树索引&#xff0c;而Memory默认的索引是Hash索引。 MyISAM…

【软件测试】在Windows使用Docker搭建CentOS环境(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 我们做软件测试在…

租服务器跑代码、pycharm连接服务器跑代码、Xshell连接服务器运行代码

一、服务器 1.1 注册 推荐使用矩池云服务器&#xff0c;按时按量计费&#xff0c;服务器自带镜像可选&#xff0c;可将要运行的项目上传到网盘 注册网址&#xff1a;矩池云 1.2 租用 选择合适的租用 1.3 选择镜像 选择合适的系统镜像 1.4 复制命令 进入租用列表&#xff…

【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历

文章目录 一、二叉树的直径思路&#xff1a;二叉树的深度优先搜索具体代码如下&#xff1a; 二、二叉树的层序遍历思路&#xff1a;借助队列实现具体代码如下&#xff1a; 总结&#xff1a; 一、二叉树的直径 点我直达~ 思路&#xff1a;二叉树的深度优先搜索 根据题目要求&a…

【计网】第三章 数据链路层

文章目录 数据链路层一、使用点对点信道的数据链路层1.1 数据链路和帧1.2 三个基本问题封装成帧透明传输差错控制 二、点对点协议 PPP2.1 PPP 协议的特点2.2 PPP 协议的帧格式2.3 PPP 协议的工作状态 三、使用广播信道的数据链路层3.1 局域网的数据链路层3.2 CSMA/CD 协议3.3 使…