面试---简历

项目

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. 动态代理的应用场景:我会提及动态代理的一些常见应用场景,如日志记录、事务管理、权限控制等。

设计模式

单例模式

是一种创建型设计模式,用于确保一个类只有一个实例,因此类的构造方法为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:终止正在运行的进程。


Bean的生命周期管理

 1、实例化bean:反射的方式生成对象。

2、填充bean的属性: 使用populateBean方法将属性值填充到一个 Java 对象,在这里会使用三级缓存来解决循环依赖的问题 。

3、调用aware接口相关的方法: 调用invokeAwareMethods方法,完成对BeanName,BeanFactory,BeanClassLoader对象的属性设置。

  • BeanName指的是当前Bean在容器中的名称。
  • BeanFactory指的是当前Bean所在的BeanFactory对象,可以通过它来获取其他Bean实例。
  • BeanClassLoader指的是加载当前Bean类的ClassLoader对象。

4、调用BeanPostProcessor中的前置处理方法: 使用比较多的有 ApplicationContextPostProcessor,设置ApplicationContext,Environment等对象,可以在应用上下文初始化的早期对Spring容器进行自定义的配置和扩展,满足应用程序特定的需求。

5、调用initmethod方法:会首先判断是否实现了InitializingBean接口。如果实现了该接口,Spring会自动调用其afterPropertiesSet方法,以执行Bean的初始化逻辑。如果没有实现InitializingBean接口,Spring则不会调用afterPropertiesSet方法。

6、用BeanPostProcessor的后置处理方法: spring的aop就是在此处实现的。

7、获取到完整的对象,可以通过getBean的方式来进行对象的获取

8、在销毁流程中,首先会判断Bean是否实现了DisposableBean接口。如果实现了该接口,Spring会自动调用其destroy方法,以执行Bean的销毁逻辑。如果没有实现DisposableBean接口,Spring则会查看配置中是否指定了destroyMethod方法名,并在销毁时调用该方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion webui 基础参数学习

哈喽&#xff0c;各位小伙伴们大家好&#xff0c;最近一直再研究人工智能类的生产力&#xff0c;不得不说随着时代科技的进步让人工智能也得到了突破性的发展。而小编前段时间玩画画也是玩的不可自拔&#xff0c;你能想想得到&#xff0c;一个完全不会画画的有一天也能创作出绘…

【测试基础01】

软件测试 一、软件测试基本概念(1)、软件测试的定义(2)、软件错误的定义(3)、测试分类 二、需求文档的评审三、软件测试计划(1)、测试范围(2)、测试环境(3)、测试策略(4)、测试管理(5)、测试风险(6)、模板 一、软件测试基本概念 (1)、软件测试的定义 软件测试是从前期需求文档…

freeswitch 使用 silero-vad 静音拆分使用 fastasr 识别

silero-vad 在git 的评分挺高的测试好像比webrtc vad好下面测试下 silero-vad 支持c 和py 由于识别c的框架少下面使用py 以下基于python3.8torch1.12.0torchaudio 1.12.0 1.由于fastasr 需要16k 所以 将freeswitch的实时音频mediabug 8k转成16k 用socket传到py 模块代码…

ChatGLM-6B 在 ModelWhale和本地 平台的部署与微调教程

ChatGLM-6B 在 ModelWhale 平台的部署与微调教程 工作台 - Heywhale.com ChatGLM-6B 介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费…

高压放大器在介电材料测试中的应用

介电材料测试是一项重要的材料性能测试&#xff0c;它涉及到物理学、化学、材料科学等多个学科领域。高压放大器是介电材料测试中的一种重要设备&#xff0c;它可以放大微弱的电信号&#xff0c;提高测试的准确性和精度。下面将详细介绍高压放大器在介电材料测试中的应用。 图&…

Web前端开发技术储久良第三版课后选择答案(1-10章)

P16-第1章 练习与实验答案 练习1 1.选择题 【1】Html是一种&#xff08;&#xff09;语言。 【A】编译型 【B】超文本标记 【C】高级程序设计 【D】面向对象编程【2】世界上第一个网页是()。 【A】http://www.w3c.org 【B】http:/info.cern.ch 【C】http://www.microsoft.com…

【论文阅读】(2023.06.09-2023.06.18)论文阅读简单记录和汇总

(2023.06.09-2023.06.12)论文阅读简单记录和汇总 2023/06/09&#xff1a;虽然下周是我做汇报&#xff0c;但是到了周末该打游戏还是得打的 2023/06/12&#xff1a;好累好困&#xff0c;现在好容易累。 目录 &#xff08;TCSVT 2023&#xff09;Facial Image Compression via …

2021电工杯数学建模B题解题思路

目录 一、前言 二、问题背景 三、具体问题 四、解题思路 &#xff08;一&#xff09;整体思路 &#xff08;二&#xff09;问题一 &#xff08;三&#xff09;问题二 &#xff08;四&#xff09;问题三 &#xff08;五&#xff09;问题四 &#xff08;六&#xff09;…

使用parcel搭建threejs开发环境

一、什么是parcel parcel官网&#xff1a;https://www.parceljs.cn/ Parcel是一个快速、零配置的Web应用打包器&#xff0c;可将JavaScript、CSS、HTML和图像等静态文件打包到一个捆绑文件中。它的主要目标是简化Web应用程序的打包过程&#xff0c;使开发人员可以更快速地创建…

【深度学习】1 感知机(人工神经元)

认识感知机 感知机接收多个输入信号&#xff0c;输出一个信号 感知机的信号只有“流/不流”(1/0)两种取值 0对应“不传递信号”&#xff0c;1对应“传递信号”。 输入信号被送往神经元时&#xff0c;会被分别乘以固定的权重。神经元会计算传送过来的信号的综合&#xff0c;只有…

怎么利用代理IP优化网络爬虫

网络爬虫会自动扫描互联网&#xff0c;搜集大量数据并将它们组织起来。但是&#xff0c;许多网站都采取了反爬虫策略&#xff0c;限制了网络爬虫的活动。这时候&#xff0c;代理IP就起到了关键作用。 一、代理ip在网络爬虫中的作用 代理ip爬虫中使用代理IP有很多好处。首先&…

OpenCV 笔记_3

文章目录 笔记_3直方图匹配(直方图规定化) 主要针对单通道图像模板匹配matchTemplate 模板匹配函数 图像卷积filter2D 卷积函数 过滤器图像噪声的产生cvflann::rand_double 产生随机浮点数在&#xff08;0~1&#xff09;之间cvflann::rand_int 产生随机整数在&#xff08;0~RAN…

golang实现webgis后端开发

目录 前言 二、实现步骤 1.postgis数据库和model的绑定 2.将pg库中的要素转换为geojson (1)几何定义 (2)将wkb解析为几何类型 (3)定义geojson类型 (4)数据转换 &#xff08;5&#xff09;数据返回 2.前端传入的geojson储存到数据库 3、其他功能实现 总结 前言 停更了…

系列二、RuoYi前后端分离(登录密码加密去除公钥)

一、问题描述 系列一虽然实现了登录时密码加密&#xff0c;但是/getPublicKey返回的结果中&#xff0c;把私钥也返回了&#xff0c;这样显然是不合理的&#xff0c;如下&#xff1a; 二、后端代码修改 2.1、RSAUtil package com.tssl.business.utils;import org.apache.comm…

【自监督论文阅读 2】MAE

文章目录 一、摘要二、引言2.1 引言部分2.2 本文架构 三、相关工作3.1 Masked language modeling3.2 Autoencoding3.3 Masked image encoding3.4 Self-supervised learning 四、方法4.1 Masking4.2 MAE encoder4.3 MAE decoder4.4 Reconstruction target 五、主要实验5.1 不同m…

flutter:数据持久化

简单的数据持久化 保存数据到本地磁盘是应用程序常用功能之一&#xff0c;比如保存用户登录信息、用户配置信息等。而保存这些信息通常使用 shared_preferences&#xff0c;它保存数据的形式为 Key-Value&#xff08;键值对&#xff09;&#xff0c;支持 Android 和 iOS。shar…

访问者模式(十八)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了命令模式(十七), 如果没有看过, 请观看上一章 一. 访问者模式 引用 菜鸟教程里面访问者模式介绍: https://www.runoob.com/design-pattern/visitor-pattern.html 在访问者模式&#xff08;Visitor Pattern&#xff09…

K8s in Action 阅读笔记——【14】Securing cluster nodes and the network

K8s in Action 阅读笔记——【14】Securing cluster nodes and the network 迄今为止&#xff0c;创建了 Pod 而不考虑它们允许消耗多少 CPU 和内存。但是&#xff0c;正如将在本章中看到的那样&#xff0c;设置 Pod 预期消耗和允许消耗的最大数量是任何 Pod 定义的重要部分。…

基于Flask+Bootstrap+机器学习的世界杯比赛预测系统

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

南京贸易企业增值税居高不下,该如何解决?

南京贸易企业增值税居高不下&#xff0c;该如何解决&#xff1f; 《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 南京作为省会城市&#xff0c;近年来由于芯片、生物医药等产业的发展而跻身前十&#xff0c;随着它在教育、军…