2021-01-18

目录
一. 自我介绍 1
二. Mybatis的实现过程 2
三. AOP 2
四. Shiro安全框架 2
五. SpringMVC 3
六.Spring 3
七.抽象类与接口的区别 3
八.类的加载过程 4
九.String常用方法及。String/stringbuffer/stringbuilder的区别 4
十.集合 4
十一. 异常 5
十二. 线程 5
十三.IO流 5
十四. Mysql引擎 6
十五. SQL语句优化 6
十六. 数据库优化 6
十七.索引 6
十七. Ajax异步调用 6
十九.Cookie与session 7
二十. springboot的执行原理 7
二十一. redis 7
二十二. springcloud 8
二十三. shiro细粒度授权认证 8
二十四. linux常用命令 8
二十五. 生产者与消费者模式 8
二十六. 跨域问题 8
二十七.项目 9

自我介绍
面试管你好,我叫杨耀翔,来自广东茂名,我是18年毕业于广州大学华软软件学院,当时在学校学的是电子信息工程的专业。
毕业之后就在深圳市尊豪网络科技有限公司 担任java开发工程师的职位,在公司主要是从事后端的开发的工作。在职期间有做过几个项目,印象比较深的就是3个,其中最近做的一个是赞购微商城的一个项目,平时我会去逛些技术论坛,比如说csdn,码云等,自己的兴趣爱好就是跑跑步打打篮球,偶尔会玩下游戏,我的自我介绍就到这里了。

离职原因:由于之前的一家公司的项目组调离了异地了然后也还不是很清楚是过去多久的一个情况,但自己的家人们又是在深圳这边的,自己也结合了下家人的意见之后选择还是留在深圳,所以就离职了。
优点:对新知识的融汇贯通能力比较强,善于接受新事物。
缺点:有时会喜欢熬夜工作,造成对身体的伤害。
为什么要来应聘这个职位:首先自己原来学的就是计算类的专业,有一定的计算机基础储备,再有一个就是自己在长期的工作中培养了一定的抗压能力,对于IT这个高强度工作的行业来说,自己是可以胜任的。
未来的职业规划:希望自己能够不断地提升自己的技术水平,往高级工程师的方向去发展。
有什么要问我的吗:请问下贵公司对新人的职业发展规划是怎么样的呢br> Mybatis的实现过程
首先加载配置文件,主要是加载链接数据库的配置文件和mapper映射文件
创建sqlsessionfactory,sqlsessionfactory建立sqlsession,执行SQL语句
当用户使用mapper.xml文件中配置的方法时,mybatis首先会解析sql动态标签为对应数据库SQL语句的形式,并将其封装进mapperstatement对象,然后通过execute将SQL注入数据库执行,并将返回的结果通过映射包装成java对象。

防止SQL注入攻击:
通过preparedstatement的set方法
通过正则表达式
AOP
代理模式:生活
是一种软件的设计思想,他是面向对象编程的一种补充和完善,通过预编译方式和运行期动态代理方式,实现在不修改源代码的情况下给程序动态添加额外功能的一种技术。
底层基于代理机制功能扩展:
采用jdk动态代理机制为目标对象创建对象(通过实现接口方式创建动态代理对象)
采用cglib代理机制为目标对象创建对象(通过继承类方式创建动态代理对象)
Shiro安全框架
认证流程分析:
首先先创建一个shiro.ini文件 调用subject.login(token)进行登录,自动委托给SecurityManage,
在这之前必须通过SecurityUtils.setSecurityManager的设置。
SecurityManager 负责真正实现身份验证的逻辑,首先会委托给Authenticator进行验证。
Authenticator会将身份验证工作委托给AuthenticationStrategy,进行多个Realm身份验证操作,
默认ModularRealmAuthenticator 会调用AuthenticationStrategy进行多Realm身份验证。
Authenticator 会把相应的token传入Realm,从Realm获取身份验证信息,
如果没有返回就会抛出异常身份验证失败,这里可以设置多个Realm按照顺序进行访问
系统调用subject相关方法将用户信息(例如isPermitted)递交给SecurityManager。
SecurityManager将权限检测操作委托给Authorizer对象。
Authorizer将用户信息委托给realm。
Realm访问数据库获取用户权限信息并封装。
Authorizer对用户授权信息进行判定。

SpringMVC
是一个web框架,mvc顾名思议,模型model,视图view,控制器controller,当我们的客户端发起请求给springmvc的时候就会执行mvc的流程了,
流程:spring mvc 先将请求发送给 DispatcherServlet。
DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。
DispatcherServlet 再把请求提交到对应的 Controller。
Controller 进行业务逻辑处理后,会返回一个ModelAndView。
Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。
视图对象负责渲染返回给客户端。
Controller与Restcontroller
六.Spring
1)功能:提供ioc技术,事务支持,aop面向切面编程,及更方便的集成第三方框架,减少配置,达到开箱即用的效果。
2)注入方式:setter,注解,构造方法
3)bean的作用域:singleton,prototype,request,session,global-session
4)ioc是一种控制反转的机制,就是将对象的代理权交给容器来去管理,由容器的DI注入给相应的类来去使用,达到减低耦合性的目的。
5)aop是软件设计的一种模式,他是面向切面编程,是面向对象编程的一种补充,对于一些非核心的业务,我们可以通过aop的方式来去实现。

七.抽象类与接口的区别
1)抽象类有构造方法
2)抽象类与接口都是不能被示例化的
3)抽象类是要被用extends关键字继承,接口是用implement关键字实现的
4)接口里的变量只能是公共的静态的常量,抽象类中的变量是普通变量

八.类的加载过程
类装载分为以下 5 个步骤:
加载:根据查找路径找到相应的 class 文件然后导入;(加载class文件)
检查:检查加载的 class 文件的正确性;(检查class文件的正确性)
准备:给类中的静态变量分配内存空间;(分配空间给静态变量)
解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;()
初始化:对静态变量和静态代码块执行初始化工作。

九.String常用方法及。String/stringbuffer/stringbuilder的区别
操作字符串的类有:String、StringBuffer、StringBuilder。
三者区别:
StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder。
String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 存储数据的字符数组没有被final修饰,说明值可以改变,抽象类AbstractStringBuilder内部都提供了一个自动扩容机制,当发现长度不够的时候(初始默认长度是16),会自动进行扩容工作,扩展为原数组长度的2倍加2,创建一个新的数组,并将数组的数据复制到新数组,所以对于拼接字符串效率要比String要高。
线程安全性:StringBuffer由于很多方法都被 synchronized 修饰了所以线程安全,但是当多线程访问时,加锁和释放锁的过程很平凡,所以效率相比StringBuilder要低。StringBuilder相反执行效率高,但是线程不安全。所以单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
执行速度:StringBuilder > StringBuffer > String。

十.集合
集合是用来存储数据的,同时储存数据也可以用数组,但是数组他只可以存储统一种数据类型的数据,所以存储不同类型的数据我们就使用到了集合作为一个容器来去管理,首先他有一个collection集合接口,然后还有map集合接口,collection主要有list与set子接口,set是无序的不可重复的,他底下的实现类主要有hashset,hashset主要用来去重的作用,因为他是不可重复的,所以可以用来去重的一个作用,hashset的底层其实还是一个hashmap,hashmap是一个k-v的形式,k值是一个唯一性的,所以是可以作为去重的,然后list是有序的可重复的,其中有两大的实现类,一个是Linkedlist,一个是Arraylist,Arraylist的底层是一个数组,查询的时候可以根据下标快速的查询到他的位置,基本是适用于查询比较多的一个场景,Linkedlist是一个双向链表,没有下标,对查找的一些业务效率就比较低一点,因为链表只需要改变他下标的指向就可以形成新的链表,所以对于一些增删的操作,效率比较高,map有treemap和hashmap,我们主要是用hashmap来做存储,hashmap是k-v的一个形式,我们可以通过k值来得到他的value值,在jdk1.8以前,他的底层是一个数组加链表的形式,因为我们可以通过k值寻找他内存中存储的位置,当对象多的时候,可能会形成hash冲突,也就是有可能计算k的时候会是一样的,就会形成一个链表,而链表不适合查询,所以当链表长度大于8 的时候,jdk1.8以后就会转化为红黑树。

异常
异常throwable包含了error及exception两类异常,exception是最大的异常类,又分为检查(编译)时异常和运行时异常,编译时经常是IO的异常,我们需要通过try-cahch或者抛出的异常,运行时异常就是编译的时候没有错误但是运行时就会发生错误的,比如空指针异常,非法参数异常,数组参数越界等等。

线程
首先新建状态,当我们new一个对象的时候,他就会处于新建一个状态,第二步,当我们调用start方法的时候就会进入就绪状态,开始抢夺资源片了,谁抢到资源片的,进入运行状态,其他没抢到的就继续处于就绪状态,当然处于运行状态也有可能会通过sleep(),或者是wait()把他进行阻塞,当运行状态结束之后就会释放资源会进入死忙状态,重新释放资源片,阻塞的进程就会继续抢夺资源片,然后继续运行,没抢到的阻塞,阻塞中有两种状态,一种是sleep(),一种是wait(),sleep()也叫休眠也叫自动唤醒,他可以通过设计他的时间,时间一到自动唤醒进程抢夺他的资源片,wait()就要手动唤醒,他会释放锁,如果不手动去唤醒他,他不会醒的,他会一直进入等待状态,直到调用notify或者notifyall重新唤醒,notify与notifyall的区别就是一个指定单一的线程,一个是全部的线程。
项目中用到多线程的地方:业务中基本是没有用到多线程的,但是在项目中我们都是交给spring去创建的,底层封装好多线程,基本上就是在查询上下订单之类的服务上。
线程的创建方式:主要有两个,一个是继承thread类,一个是实现runnable接口,其他的都是对这两个的封装,常用的是runnable,因为java的特征是单继承多实现的。
调用Start与run方法的区别:start方法里面是重写run方法的,调用run方法不能启动一个线程,当调用start方法的时候才能启动一个线程。

十三.IO流
字节流与字符流的区别:字节流是由字节组成,字符流是由字符组成,字节流对于任意的文件都能传输,字符流只能传输纯文本的数据。字节流的类都带stream的,而字符流没有。

Mysql引擎
InnoDB与MyIASM的区别:InnoDB 支持事务,MyISAM 不支持事务。 InnoDB 支持外键,而 MyISAM 不支持。InnoDB 是聚集索引,MyISAM 是非聚集索引,InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁(所以innoDB可以处理大数据容量的数据库系统)

SQL语句优化
查找数据库的时候尽量避免全盘扫描,
用where子句的时候,避免用null进行判断,避免有!=号和,
避免用in和not in。
尽量少用*而用字段。
用union代替or

数据库优化
为搜索字段创建索引。
避免使用 select *,列出需要查询的字段。
垂直分割分表。读写分离
选择正确的存储引擎。
Sql语句优化。

十七.索引
唯一索引:代表这个列里面的所有内容只能有一条数据,允许为空
主键索引:数据列不允许重复,不允许为Null,唯一主键
普通索引:
全文索引:

Ajax异步调用
主要通过jquery调用几大函数,平时有用的是有post,get,ajax等的向springmvc的controller发起页面的请求。
第一步:基于dom事件创建XHR对象(XMLHttpRequest对象)
第二步:注册XHR对象状态监听,通过回调函数(callback)处理状态信息。
第三步:创建与服务端的连接
第四步:发送异步请求实现与服务端的通讯
第五步:通过回调(callback)函数,获得响应结果并进行数据更新.(非阻塞)

十九.Cookie与session
存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。
安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。
容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。
存储的多样性:session 可以存储在 Redis 中、数据库中、应用程序中;而 cookie 只能存储在浏览器中。

二十. springboot的执行原理
spring boot 是为 spring 服务的,是用来简化新 spring 应用的初始搭建以及开发过程的。

首先主启动类main方法运行,首先@springbootapplication注解生效,注解生效后加载@springbootconfiguration和@enableAutoConfiguration注解,然后又加载@autoconfigurationPackage包扫描注解,和@Import开箱即用的核心注解
二十一. redis
redis怎么整合到项目中:
添加jedis的依赖
编辑redis.properties文件,指定redis节点的ip:port
2.由于redis比较重要,很多业务系统都需要调用,所以将redis整合写入common
3.通过配置类(配置文件)形式整合redis.
4.通过编写切面的类,再在需要用到的业务方法上添加注解
2)雪崩:
缓存雪崩是指,缓存层出现了错误,不能正常工作了。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。
解决:通过设置redis集群。通过增加消息队列(队列在redia与数据库之间)的形式进行流量消峰。对不同的key值设置不同的过期时间。
3)缓存穿透(访问一些一定没有的数据,每次都到数据库中去查询)的解决方案:通过反回一个空值给redis。通过布隆过滤器。
4)redis的优化/提高利用率:4中优化算法:把一些不经常访问以及近期访问量较少的数据淘汰掉,淘汰算法有四种:近期最少使用算法。最不经常使用算法。随机算法。设置过期时间算法。
5)存了哪些数据:主要是针对一些热门商品信息放在缓存中。用户信息的分布式缓存,商品信息的缓存,商品库存缓存,订单的缓存,商品的叶子类目缓存
6)redis中的数据的过期时间是永不过期的。
二十二. springcloud
真正的项目中是没有接触过微服务的框架集的,但是自己有通过一些场景来搭建成功过的。
主要的话是包括几大组件。

二十三. shiro细粒度授权认证
细粒度主要是权限认证的划分,更细粒的划分,比如说:部门他只能查看本部门下的员工的信息。在项目中就是细致到方法上了。
二十四. linux常用命令

二十五. 生产者与消费者模式

生产者就是消息或者是数据的提供者,就像项目中的后端各大模块子系统的服务器。
消费者就是消息和数据的使用者,就像项目中的web客户端服务器。

二十六. 跨域问题
Jsonp:用于前后台服务器之间的数据的反问,主要是通过javascript标签的src属性实现跨域。

二十七.项目
项目亮点:
1.利用缓存减少数据库的压力,以及读取缓存的速度远远快于数据库(网络时延+IO)
2.页面静态化和前后端分离技术技术加快用户访问速度,提高QPS,异步下单增强用户体验,以及内存标记减少Redis的访问。
3.安全性优化:双重md5密码校验,秒杀接口地址的隐藏,接口限流防刷,数学公式验证码。
4.为了在前端就限制同一时间的高并发,我也想到了一些前端就限制掉一些用户的做法。
项目难点:
大量使用缓存,就会存在缓存的过期时间控制以及缓存击穿以及缓存雪崩问题
解决方案:针对不同的缓存设置不同的过期时间,比如说cookie,设置30分钟过期,并且加入一层再登录增加缓存时间的机制,减少了缓存过期的几率,对于热卖商品信息,设置10分钟的过期时间
高并发的时候,订单业务来不及同步处理,Redis压力,数据库有时候会有大量的insert 和update 操作,甚至请求堆积过多的时候,to many connectionsbr> 想到了消息队列,用来异步处理请求。每次请求过来,先不去处理请求,而是放入消息队列,然后在后台布置一个监听器,分别监听不同业务的消息队列,有消息来的时候,在进行秒杀抢票操作。这样防止多个请求同时操作的时候,数据库连接过多的异常。

来源:杨牟牟的知识裤囊

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月16日
下一篇 2021年1月16日

相关推荐