Java⽜客⽹社区项⽬——知识点⾯试题
Java⽜客⽹社区项⽬——知识点&⾯试题
持续更新中( ·_·)
⽂章⽬录
请简要介绍⼀下你的项⽬?
这个项⽬的整体结构来源于⽜客⽹,主要使⽤了Springboot、Mybatis、MySQL、Redis、Kafka、等⼯具。主要实现了⽤户的注册、登录、发帖、点赞、系统通知、按热度排序、搜索等功能。另外引⼊了redis数据库来提升⽹站的整体性能,实现了⽤户凭证的存取、点赞关注的功能。基于 Kafka 实现了系统通知:当⽤户获得点赞、评论后得到通知。利⽤定时任务定期计算帖⼦的分数,并在页⾯上展现热帖排⾏榜。
什么是Spring框架?
有很多模块组成,利⽤这些模块可以⽅便开发⼯作。这些模块是:核⼼容器(spring core)/数据访问和集成(Spring JDBC)/Web(Spring Web/MVC)/AOP(Spring Aop)/消息模块/测试模块(Spring Test)等。
对Spring IoC的理解
IoC的意思是控制反转,是⼀种设计思想,把需要在程序中⼿动创建对象的控制权交给了Spring框架。IoC的载体是IoC容器,本质是⼀个⼯⼚,数据结构上来看是⼀个Map,⽤来存放着各种对象。当我们创建⼀个对象时,只需要配置好配置⽂件/注解,⽽不⽤担⼼对象是怎么被创建出来的。mysql面试题型
IoC的优点:降低耦合,对象被容器管理需要两份数据:你的对象定义 + 配置⽂件,对象间的关系体现在配置⽂件,不会直接产⽣耦合。prefix翻译
什么是DAO
data access object,存放数据库访问对象。
Spring中关于Bean的注解
四种常见Bean
@Controller @Repository @Service @Component⼀般来说Bean只会被容器初始化⼀次,@PostConstruct:初始化前调⽤
@PreDestroy:销毁之前
如何使⽤Bean
bean通过容器管理,不需要我们实例化,如果要使⽤某个bean,使⽤依赖注⼊ @Autowired
Spring MVC是什么,是怎样的⼯作流程
服务器分为表现层/业务层/数据层,其中Spring MVC是⼯作在表现层,作⽤是接收/解析⽤户发送的请求,调⽤对应的业务类,根据业务类返回的结果(ModelAndView),调⽤view进⾏视图渲染,并将渲染后的View返回给请求者。具体分为以下8步。
科技感数据大屏源码下载1. 客户端(浏览器)发送请求给前端处理器(DispatcherServlet)(发送请求,响应结果);
2. DispatcherServlet根据请求信息调⽤HandlerMapping,查到对应的Handler;
3. 查到对应的Handler(也就是Controller)后,由HandlerAdapter适配器处理;
4. HandlerAdapter根据Handler来调⽤真正的Controller;
5. Controller进⾏业务处理,返回ModelAndView对象,Model是数据对象,View是逻辑上的View;
access的形容词和副词6. ViewResolver根据逻辑view到实际view;
7. DispatcherServlet把Model传给view进⾏视图渲染,然后返回给请求者。
C - Controller:控制器。接受⽤户请求,调⽤ Model 处理,然后选择合适的View给客户。
M - Model:模型。业务处理模型,接受Controller的调遣,处理业务,处理数据。
V - View:视图。返回给客户看的结果。
DispatcherServlet处理流程?
DispatcherServlet 处理流程:
在整个 Spring MVC 框架中,DispatcherServlet 处于核⼼位置,它负责协调和组织不同组件完成请求处理并返回响应⼯作。DispatcherServlet 是 SpringMVC统⼀的⼊⼝,所有的请求都通过它。DispatcherServlet 是前端控制器,配置在l⽂件
中,Servlet依⾃已定义的具体规则拦截匹配的请求,分发到⽬标Controller来处理。 初始化 DispatcherServlet时,该框架在web应⽤程序WEB-INF⽬录中寻⼀个名为[servlet-名称]-l的⽂件,并在那⾥定义相关的Beans,重写在全局中定义的任何Beans。在看DispatcherServlet 类之前,我们先来看⼀下请求处理的⼤致流程:
1. Tomcat 启动,对 DispatcherServlet 进⾏实例化,然后调⽤它的 init() ⽅法进⾏初始化,在这个初始化过程中完成了:对 l
中初始化参数的加载;建⽴ WebApplicationContext(SpringMVC的IOC容器);进⾏组件的初始化;
2. 客户端发出请求,由 Tomcat 接收到这个请求,如果匹配 DispatcherServlet 在 l中配置的映射路径,Tomcat 就将请求转
交给 DispatcherServlet 处理;
3. DispatcherServlet 从容器中取出所有 HandlerMapping 实例(每个实例对应⼀个 HandlerMapping接⼝的实现类)并遍历,每个
HandlerMapping 会根据请求信息,通过⾃⼰实现类中的⽅式去到处理该请求的 Handler(执⾏程序,如Controller中的⽅法),并且将这个 Handler 与⼀堆 HandlerInterceptor ()封装成⼀个 HandlerExecutionChain 对象,⼀旦有⼀个 HandlerMapping 可以到 Handler则退出循环;
4. DispatcherServlet 取出 HandlerAdapter 组件,根据已经到的 Handler,再从所有HandlerAdapter 中到可以处理该
Handler 的 HandlerAdapter 对象;
5. 执⾏ HandlerExecutionChain 中所有的 preHandler() ⽅法,然后再利⽤
HandlerAdapter 执⾏ Handler ,执⾏完成得到 ModelAndView,再依次调⽤的
postHandler() ⽅法;
6. 利⽤ ViewResolver 将 ModelAndView 或是 Exception(可解析成 ModelAndView)解析成View,然后 View 会调⽤ render()
⽅法再根据 ModelAndView 中的数据渲染出页⾯;
7. 最后再依次调⽤的 afterCompletion() ⽅法,这⼀次请求就结束了。
的作⽤
⽬的:让未登录⽤户不能访问某些页⾯
原理:在⽅法前标注⾃定义注解,拦截所有的请求,只处理带有该注解的⽅法。
什么是SSM框架?
包括Spring + Spring MVC(和Spring天⽣集成) + MyBatis(帮你和数据库打交道的框架,简单的设置,你就可以像Java⼀样,操作数据库了)
怎么实现注册功能的?
根据请求来拆解功能
1,打开注册⽹页
2,把注册的信息发送给服务器(点注册)
3,把激活邮件发送给邮箱
4,利⽤激活链接打开⽹页
每⼀次请求都是先开发数据访问层,在开发业务层,最后开发视图层(三层架构),但是每⼀次请求不⼀定要⽤到这三层
什么是Interceptor,在项⽬的哪⾥使⽤到了Interceptor?
Interceptor是SpringMVC的处理器(handler),⽤于对处理器进⾏预处理和后处理。本项⽬中,
每次请求都会检查request中的login_ticket,把到的user信息存放在协程中,并在完成处理后,⾃动释放。(⽅便的进⾏⽤户信息取⽤)
使⽤什么技术⽣成验证码?
使⽤Kaptcha包,可随机⽣成字符和图⽚。
如何检查登陆状态
加注解。
如何实现敏感词过滤
使⽤前缀树(字典树)存储敏感词,对text中的敏感词实现替换。
什么是Ajax,应⽤在项⽬哪些地⽅?
ajax指异步的json和xml技术,不是⼀门新的语⾔,⽽是使⽤现有技术的新⽅法。最⼤的特点是:不重新加载整个页⾯的基础上,可以与服务器交换数据,并更新部分⽹页数据。
项⽬中:帖⼦发布成功/失败的提⽰,使⽤到ajax
什么是事务,事务的四⼤特性。
定义:事务是逻辑上的⼀组操作,要么都执⾏,要么都不执⾏。
事物的四⼤特性-ACID:
A:原⼦性,事务是最⼩的执⾏单位,不允许被分割,事务的全部操作要么全部提交成功,要么全部失败回滚。
C:⼀致性,数据库在事务执⾏前后保持⼀致性状态,在⼀致性状态下,所有事务对同⼀个数据的读取结果相同。
I :隔离性,⼀个事务所作的修改在最终提交前,对其他事务是不可见的。避免多个事物交叉执⾏所导致的数据不⼀致问题。
D(Duability):持久性,⼀旦事务提交,所做的修改将被永远保存到数据库中。即使系统发⽣崩溃,事务执⾏的结构也不能丢失。
怎么利⽤Spring实现事务管理
Spring管理事务忽略了底层数据库的结构,⾮常⽅便。有两种⽅式:注解(类型,传播⽅式)/编程式事务(override)。
是怎样实现统⼀捕获异常的?
在SpringBoot的项⽬某⼀路径下,加上对应的错误页⾯,发⽣错误时⾃动会跳转。服务器的三层结构中,错误会层层向上传递,所以只需要在表现层(controller)统⼀处理错误即可。
⽅法:在controller中加上advice包,并通过注解@ControllerAdvice和@ExceptionHandler,统⼀捕获异常。
是怎样实现统⼀记录⽇志的?
使⽤了AOP技术(⾯向切⾯编程),这⾥使⽤到的是SpringAOP。 AOP技术能够将哪些与业务,但是为业务模块共同调⽤的逻辑或责任(⽐如事务处理,⽇志记录,权限控制等),封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的扩展性和维护性。 SpringAOP本质上基于动态代理,当要代理的对象实现了某接⼝,会使⽤JDK动态代理,在运⾏时通过创建接⼝的代理实例,织⼊代码。当要代理的对象没有实现接⼝,则使⽤Cglib技术(编译时增强),通过⼦类代理织⼊代码。
什么是Redis,Redis有哪些优点?
概念:redis是⼀个⾮关系型数据库,数据存储在内存中,读写速度快。可以存储键和五种不同类型值的映射。只能以字符串为键,值⽀持:字符串,列表,⽆序集合,有序集合,hash散列表。
优点:由于数据存储在内存中,读写速度⾮常快,满⾜⾼性能,⾼并发的系统要求。与Java原⽣的map/guava相⽐,⽀持分布式缓存。与memcached相⽐,⽀持更丰富的数据类型,且⽀持数据持久化。
Redis分布式集架构
典型的分⽚+复制
怎么往Spring框架中配置Redis,介绍常见的Redis操作
如何配置:
1,导⼊jar包
2,配置端⼝,以及配置类redisTemplate(注⼊连接⼯⼚/设置序列化⽅式(json))
常见操作
Value类型:redisTemplate.opsForValue().set(redisKey, 1),redisTemplate.opsForValue().get(redisKey),
redisTemplate.opsForValue().increment(redisKey),
Hash类型:redisTemplate.opsForHash().put(redisKey, “id”, 1), 还有get等操作
List类型:redisTemplate.opsForList().leftPush(redisKey, 101), 还有size, index, range, leftPop等操作
Set类型:add, size, pop, members等操作
Zset类型:redisTemplate.opsForZSet().add(redisKey, “Linda”, 92), 有socre,rank,reverseRank, range等操作
操作key:可以delete,以及设置过期时间
同时⽀持绑定操作,⽀持事务(编程式事务,在事务中⼀般不包含查询)
protobuf原理
为什么不包含查询:redis事务就是⼀系列命令的批量操作,批量操作在发送 EXEC 命令前被放⼊队列缓存,并不会被实际执⾏,也就不存在事务内的查询要看到事务⾥的更新,事务外查询不能看到。
项⽬中Redis的作⽤
1、事务操作:redisTemplate直接调⽤opfor…来操作redis数据库,每执⾏⼀条命令是要重新拿⼀个连接,因此很耗资源,让⼀个连接直接执⾏多条语句的⽅法就是使⽤SessionCallback,同样作⽤的还有RedisCallback,但不常⽤。
2、使⽤redis存储验证码:
1. 因为验证码需要频繁的进⾏访问与刷新,因此对性能的要求较⾼;
2. 验证码不需要永久保存,通常在很短的时间后就会失效;
3. 分布式部署的时候,存在session共享的问题。
3、使⽤redis存储登录凭证:
因为后台在每次处理请求的时候都要查询⽤户的登录凭证,访问的频率⾮常⾼,因此需要使⽤redis存储。
4、使⽤redis缓存⽤户信息:
因为后台在每次处理请求的时候都要根据⽤户的凭证⽤户信息,访问的频率⾮常⾼。
5、Redis可以使⽤zset对需要排序的数据进⾏⾃定义的排序。
怎样存储的点赞/关注/缓存⽤户数据
点赞使⽤set类型存储,key为点赞对象,set中保存点赞⼈的ID
关注使⽤zSet类型存储,key为被关注者,set保存关注者以及关注时间为score
缓存⽤户数据使⽤Value类型,key为⽤userID得到的key,value为user对象(设置过期时间,且数据修改时需要清除缓存)
什么是消息队列
消息队列是⼀个存放消息的容器,⽣产者把消息放在队列中,消费者从消息队列中取出数据。消息队列的主要功能(优点)在于:
1. 解耦:⽣产者只负责把消息放在队列中,⽽不⽤关⼼谁去使⽤它。
二郎神是干什么的2. 异步:⽣产者把消息放在队列中后即可返回,⽽不⽤⼀个个的通知消费者去执⾏,消费者是异步的获取消息的。
3. 限流:⽣产者⼀次性产⽣⼤量的数据时,不会给消费者造成压⼒,消费者可以根据⾃⾝的能⼒,去消息队列中取数据。
消息队列作为信息传递的中间件,需要注意哪些问题?
1、⾼可⽤:因为消息队列如果宕机,会导致整个系统不可⽤。(分布式/集的现成⽀持)
2、数据持久化:防⽌数据丢失
3、如何取数据:消息队列主动通知或者消费者轮询。
Java中的blockingqueue,可以提供线程间的消息队列
BQ也是⽣产者与消费者模式,属于点对点式消息队列?(⼀个消息只会被消费⼀次)Blocking Queue构建了⼀个桥梁,能够解决⽣产速度/消费速度不匹配问题。阻塞的时候只是在那⾥等着,但是不会占⽤CPU资源,对性能不会有影响。
什么是Kafka,有哪些功能和应⽤场景?
Kafka为分布式流处理平台。流处理是指对不断产⽣的动态数据流实时处理,基于分布式内存,具有数据处理快速,⾼效,低延迟的特性。
Kafka简介:Kafka是⼀种消息队列,主要⽤来处理⼤量数据状态下的消息队列,⼀般⽤来做⽇志的处理,是⼀个分布式、⽀持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最⼤的特性就是可以实时的处理⼤量数据以满⾜各种需求场景
特点:
⾼吞吐量、低延迟:kafka每秒可以处理⼏⼗万条消息,它的延迟最低只有⼏毫秒,每个topic可以分多个partition, consumer group 对partition进⾏consume操作。
可扩展性:kafka集⽀持热扩展
持久性、可靠性:消息被持久化到本地磁盘,并且⽀持数据备份防⽌数据丢失
容错性:允许集中节点失败(若副本数量为n,则允许n-1个节点失败)
⾼并发:⽀持数千个客户端同时读写
Kafka主要提供的功能包括:消息系统,⽇志收集,⽤户⾏为跟踪,流式数据处理。
Kafka的基础架构
Producer:消息⽣产者,向Kafka中发布消息的⾓⾊。
Consumer:消息消费者,即从Kafka中拉取消息消费的客户端。
Consumer Group:消费者组,消费者组则是⼀组中存在多个消费者,消费者消费Broker中当前Topic的不同分区中的消息,消费者组之间互不影响,所有的消费者都属于某个消费者组,即消费者组是逻辑上的⼀个订阅者。某⼀个分区中的消息只能够⼀个消费者组中的⼀个消费者所消费
Broker:经纪⼈,⼀台Kafka服务器就是⼀个Broker,⼀个集由多个Broker组成,⼀个Broker可以容纳多个Topic。
Topic:主题,可以理解为⼀个队列,⽣产者和消费者都是⾯向⼀个Topic
Partition:分区,为了实现扩展性,⼀个⾮常⼤的Topic可以分布到多个Broker上,⼀个Topic可以分为多个Partition,每个Partition是⼀个有序的队列(分区有序,不能保证全局有序)
Replica:副本Replication,为保证集中某个节点发⽣故障,节点上的Partition数据不丢失,Kafka可以正常的⼯作,Kafka提供了副本机制,⼀个Topic的每个分区有若⼲个副本,⼀个Leader和多个Follower
Leader:每个分区多个副本的主⾓⾊,⽣产者发送数据的对象,以及消费者消费数据的对象都是Leader。
Follower:每个分区多个副本的从⾓⾊,实时的从Leader中同步数据,保持和Leader数据的同步,Leader发⽣故障的时候,某个Follower会成为新的Leader。
Kafka的消息模型,以及常见术语
消息模型:发布-订阅模型,消费者订阅了某⼀主题(topic)后,⽣产者采⽤类似⼴播的⽅式,将消息通过主题传递给所有的订阅者。Topic:主题,类似于⽂件夹,⽤来存放不同的数据。
Partition:主题分区,同⼀主题的不同分区可以存放在不同的Broker上⾯,保证并发能⼒和负载均衡。
Offset:消息在Partition中的存放位置。
Broker:可以理解为kafka集⾥⾯的⼀台或多台服务器,它本⾝是没有复制的,上⾯可能运⾏着topic1的leader, topic2的follower等等。
在项⽬哪⾥⽤到了Kafka?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。