Java初级开发工程师面试题合集 |
您所在的位置:网站首页 › java开发初级面试题库及答案 › Java初级开发工程师面试题合集 |
一.多线程
什么是多线程?
多线程是指程序中包含多个流,即在一个程序中可以同时进行多个不同的线程来执行不同的任务 多线程的优劣? 优点:可以提高CPU利用率, 提高了程序的效率, 单个程序可以创建多个不同的线程来完成各自的任务 缺点:线程也是程序,需要占据内存.多线程需要协调和管理,所以需要CPU跟踪线程. 并发和并行的区别? 并发:多个任务在同一个CPU上,按照细分的时间片段轮流交替执行. 并行:单位时间内,多个处理器或者多核处理器同时处理多个任务,真正意义上的同时进行 并发编程三要素(怎么保证多线程的线程安全,线程安全在哪些方面体现)? 原子性:一个或多个操作, 要么全部执行且不被打断, 要么就全部不执行 可见性: 多个线程操作一个共享变量时, 其中一个变量修改后, 其他线程可以立刻看到修改结果 有序性:程序的执行顺序按照代码先后顺序来执行 线程与进程的区别? 根本区别:进程是操作系统资源分配的基本单元,线程是处理器任务调度和执行的基本单位 包含关系:如果一个进程内有多个线程,则执行的过程不是一条线的,而是多条线(多线程),共同完成,线程是进程的一部分. 内存分配:同一个进程的线程共享本进程的地址空间和资源,进程之间的地址空间和资源是相互独立的. 守护线程:服务线程,准确的来说就是服务其他的线程 什么是线程死锁 死锁是指两个或者以上的进程(线程)在执行过程中, 由于竞争资源或由于彼此通信造成的一种堵塞现象,若无外力作用,都将无法进行推进,此时的系统处于死锁状态. 形成死锁的条件及解决办法 互斥条件:一个资源只能被一个进程占用,直到该进程被释放 请求与保持条件:一个线程请求被占有资源而发生堵塞时,对以获取资源保持不放 不剥夺条件:线程以获取的资源在未使用完之前不能被其他线程强行剥夺, 只有等自己使用完才释放资源. 循环等待条件: 发生死锁时, 等待的线程必定形成一个环路, 死循环造成永久堵塞. 解决办法:一次申请所有资源. 占有部分资源的线程尝试申请其它资源, 申请不到,主动释放它占有的资源. 按顺序来申请资源. 创建线程的四种方式 继承Thread类 实现Runnable接口 实现Callable接口 Executors工具类创建线程池 runnable和callable的区别: runnable中的run()方法返回void,只是纯粹执行run()方法中的代码callable:中的call()方法有返回值,一个泛型,和Future,FutureTask配合可获得异步执行的结果 run()方法和start()方法有什么区别 start()方法用于启动线程, run()方法用于执行线程的运行代码, run()可以反复调用, 而start() 方法只能被调用一次 调用start()方法启动线程可以使线程进入就绪状态, 等待运行; run()方法只是thread的一个普通方法调用, 还是在主线程里执行. 线程生命周期的6个状态 新建(NEW):初始化状态,未启动 就绪(RUNNABLE):已经调用Thread 的start方法启动了, 等待CPU调度, 就绪状态 销毁(TERMINATED):死亡状态, 已正常执行完run()中的方法,或者因为未捕捉的异常而终止run()方法了 计时等待(TIMED_WAITING):睡眠状态, 调用sleep(参数)或wait(参数)后线程进入计时休眠状态, 等待(WAITING):调用wait()方法, 释放锁进入无线等待状态 阻塞(BLOCKED):运行的线程执行wait()方法, 运行的线程获取对象的同步锁时, 同步锁被别的线程占用, 进入阻塞状态. sleep()和wait()有什么区别 相同:两者都可以使线程进入等待状态 不同:sleep()是Thread类下的静态方法, wait()是Object类下的方法 sleep()不释放锁, wait()释放锁 wait()常用语线程之间的通信, sleep()常用语暂停执行. 如何在两个线程之间共享数据? 两个线程之间共享变量即可实现共享数据. 一般来说共享变量要求变量本身是线程安全的, 然后再线程中对变量使用 什么是线程安全?Servlet是线程安全的吗? 线程安全是指某个方法在多线程的环境下被调用时, 能够正确处理多线程之间的共享变量, 使程序能正确完成. Servlet不是线程安全的, 它是单实例多线程, 多个线程访问一个方法时, 不能保证共享变量是安全的 什么是线程池? 提前常见若干个线程, 有任务需要处理, 线程池里的线程就会处理任务, 处理完线程后线程并不会销毁, 而是等待下一个任务,存放在线程池中. Java提供了一个java.util.concurrent.Executor接口用于创建线程池 四种线程池的创建 newCachedThreadPool:创建一个可缓存线程池 newFixedThreadPool:创建一个定长线程池,提交一个任务就创建,可控制线程最大并发数 newScheduledThreadPool:创建一个固定长度线程池, 支持定时及周期性执行任务 newSingleThreadExecutor:创建一个单线程化的线程池, 它只会用唯一的工作线程来执行任务 线程池的五种状态? RunningShutDownStopTidying:Terminated 线程池的优点? 重用存在的线程, 减少对象创建销毁的开销 可有效的控制最大并发线程数, 提高系统资源的使用率, 同时避免过多资源竞争, 避免堵塞 提供定时执行, 定期执行, 但线程, 并发数控制等功能 什么是乐观锁和悲观锁 乐观锁:对并发间操作产生的线程安全问题持乐观状态, 将比较-替换这两个动作作为一个原子去修改内存中的变量; 通过不加锁来处理资源 悲观锁: 每次对某资源进行操作时, 都会持有一个独占的锁; 将资源锁住, 等一个之前获得锁的线程释放锁后, 下一个线程才可以访问 多线程同步有哪几种方法? Synchronized关键字:用来给方法,代码块加锁。共享对象头。Java自带,Jvm层面。非公平,适合少量代码同步问题 Lock锁实现:共享某个变量。一个Java类。公平,适合大量同步代码同步问题 分布式锁:多个进程不在同一个系统中,使用分布式锁控制多个进程对资源的访问。 Synchronized的底层实现原理?synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 普通同步方法:锁是当前实例对象静态同步方法:锁是当前类的class对象同步方法快:锁是括号里面的内容 二.集合框架 什么是集合? 集合可以看做是一种容器, 用来存储对象信息 数组和集合的区别? 数组长度不可变,无法保存有映射关系的数据, 集合用于保存不确定的数据, 以及保存具有映射关系的数据 数组元素可以使基本类型的值, 也可以是对象, 集合只能保存对象 Java集合类主要有两个接口Conllection和Map Collection接口常用集合: ArrayList, LinkedList, HashSet, TreeSet, Vector Map接口常用集合: HashMap, TreeMap Collections和Collection的区别Collections:是集合类的工具类提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。 Collection:集合的顶级接口 List, Set, Map的区别? List: 有序, 可重复集合, 集合中每个元素都有对应顺序索引 Set: 有序, 不可重复集合, 重复元素会覆盖 Map: 键值对存储, 无序, 元素不可重复,重复元素覆盖 HashMap和Hashtable的区别? 都是集合,底层哈希算法 区别: HashMap线程不安全,效率高。可以存储null键值对Hashtable线程安全(每个方法中都加入了synchronized),效率低,不可以存储null键值 HashMap的数据结构 jdk1.7: HashMap实际上是一个数组和链表结构的散列表 jdkq.8: 链表中的元素超过了8个后, 会将链表转换为红黑树 HashSet的实现原理? HashSet底层有HashMap实现HashSet值存放于HashMap的key上HashMap的value值统一为present ArrayList和LinkLIst的区别?ArrayList底层数据结构是数组 LinkList底层数据结构是链表 List转换为数组:ArrayList的toArray方法 数组转换为List:调用Arrays的asList方法 ArrayList和Vector的区别? Vector是同步的,ArrayList不是。线程安全, 数据增长原来的2倍ArrayList是同步的,不会过载,比Vector快。非线程安全, 数据增长没有明确规定, 源码来看是增长原来的1.5倍 哪些集合是线程安全的? vector:线程安全,效率低HashTable:线程安全statck:堆栈类,先进后出 三.网络编程 TCP与UDP的区别 TCP:传输控制协议, 为应用程序提供可靠的通信连接,适合一次传输大批数据的情况,面向连接的协议 UDP: 用户数据包协议, 提供无连接通讯, 且不对传送包进行可靠的保证 TCP为可靠的连接, UDP为不可靠的连接 TCP占有系统资源较多, UDP占有系统资源少 TCP保证数据准确性, UDP可能丢包, TCP保证数据顺序,UDP不保证 三次握手,四次挥手详细过程及作用建立连接: 一次握手: 客户端发送syn包到服务器,等待服务器确认 二次握手: 服务器收到syn包, 确认客户的syn, 同时自己发送syn + ACK包给客户端并进入等待 三次握手: 客户端收到服务器的SYN + ACK包, 完成三次握手, 开始发送数据 三次握手完成后, 客户端与服务器才正式开始传送数据 断开连接: 一次挥手:主动关闭方发送FIN用来关闭主动方到被动关闭方的数据传送 二次挥手: 被动关闭方收到FIN包后, 发送一个ACK给对方 三次挥手: 被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送 四次挥手: 主动关闭方收到FIN后, 发送一个ACK给被动关闭方 四层网络模型和七层网络模型四层网络模型: 应用层:应用程序间沟通的层 传输层:负责传输数据,并确认数据已送达并接收 互联网络层: 负责提供基本的数据封包传送功能 网络接口层:对实际的网络媒体的管理, 定义如何使用实际网络 OSI七层网络模型: 物理层, 数据链路层, 网络层, 传输层, 会话层, 表示层, 应用层 什么是Socket? Socket: 用于描述IP地址和端口, 可以用来实现不同虚拟机或者计算机之间的通信, 在Internet上的主机一般运行了多个服务软件, 每种服务打开一个Socket, 并绑定到一个端口上, 不同端口对应不同的服务. IO流IO流是用来处理设备之间传输数据,下载文件,上传文件。 按照流向分,可以分为输入流和输出流 按照操作单元分,可以分为字节流和字符流 按照角色划分为节点流和处理流 输入流:程序从输入流中读取数据, 输出流:程序向输出流写入数据。程序将数据输出到外界。 BIO,NIO,AIO的区别? BIO:block IO同步阻塞式IO,传统IO,并发处理能力低NIO:Non IO同步非阻塞IO,客户端和服务器通过Channel(通道)通讯,实现了多路复用AIO:Asynchronous IO是NO的升级,NIO2,实现了异步非阻塞IO,异步IO的操作基于事件和回调机制。 四.网络协议 网络协议:计算机网络要有条不紊的交换数据, 就必须遵守一些实现约定好的规则, 这些规则被称为网络协议. 网络层协议: IP协议, ICMP协议, ARP协议, RARP协议 传输层协议: TCP协议, UDP协会 应用层协议: FTP, TeInet, SMTP, HTTP, RIP, NFS, DNS 什么是HTTP, HTTP与HTTPS的区别? HTTP:(Hyper Text Transfer Protocol 超文本传输协议) 端口80, 运行在TCP上, 明文传输, 短连接, 客户端与服务端都无法验证对方身份 HTTPS: 端口443, 添加了加密和认证机制的HTTP Session, Cookie, Token的区别 HTTP协议本身是无状态的, 即服务器无法判断用户身份 cookie: web服务器保存在用户浏览器上的小文件(key-value格式), 包含用户相关信息. session: 浏览器和服务器会话过程中, 服务器分配的一块存储空间.存放在服务器上 token: 服务器生成的一串字符串, 作为客户端请求的一个令牌, 第一次登陆后, 服务器生成一个token将此token返回给客户端, 客户端请求携带token请求数据即可. 适用于前后端分离项目. 五.Redis 什么是Redis?为什么要用redis? Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。 高性能和高并发:直接操作内存,速度快。数据结构简单,对数据操作也简单。采用单线程,不存在加锁释放锁的操作,不会导致死锁。能接受的请求远大于直接访问数据库。 Redis支持的数据类型有哪些? Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串(String)、列表(List)、集合(Set)、散列表(Hash)(内部是HashMap,成员较少以一维数组存储,成员增多转成HashMap)、有序集合(zset)。 Redis的优缺点有哪些?优点:读写性能优异,支持数据持久化,支持事务,数据结构丰富,支持主从复制 缺点: 数据库容量收到物理内存的限制。 Redis不具备自动容错和恢复功能 较难支持在线扩容 什么是Redis持久化?Redis有哪些持久化方式?持久化:把内存中的数据写入到磁盘中,放置服务器宕机导致内存数据丢失。 方式: RDB(默认Redis DataBase):把当前数据生成快照保存在硬盘 AOF(Append-only file):记录每次对数据的操作到硬盘上 手动持久化命令: save save 和 bgsave命令都可以手动触发RDB持久化save 命令会阻塞 Redis 服务,直到 RDB 持久化完成。存储大量数据时,会造成较长时间的阻塞。bgsave Redis 进程会执行 fork操作创建子进程,RDB 持久化由子进程负责,不会阻塞 Redis 服务进程,Redis 服务的阻塞只发生在 fork 阶段。Redis 会自动触发 RDB 持久化,自动触发的 RDB 持久化都采用 bgsave 的方式 配置文件中设置 save 的相关配置,如 save m n,表示在 m 秒被修改过 n 次,自动触发 bgsave 操作。从节点做全量复制时,主节点自动进行 bgsave 操作, 并把生成的 RDB文件发送给从节点。执行 debug reload 命令时也会触发 bgsave 操作。执行 shut down 操作时,如果没有开启 AOF 持久化也会自动触发 bgsave 操作。比较: AOF 把每次写命令追加写入日志中,解决了数据持久化的实时性,主流的 Redis 持久化方式。 AOF 文件比 RDB 更新频率高,优先使用aof还原数据 AOF 比 RDB 更安全 RDB 恢复数据速度比 AOF 的快,适合备份,全量复制,灾难恢复等。 AOF 持久化配置 appendonly yes # appendonly 改为 yes,开启 AOFappendfilename “appendonly.aof” # AOF 文件的名字appendfsync everysec # AOF 文件的写入方式, everysec 每秒将缓存区内容写入文件 默认的写入方式auto-aof-rewrite-percentage 100 # 运行 AOF重写时 AOF 文件大小的增长率的最小值auto-aof-rewrite-min-size 64mb # 运行 AOF 重写时文件大小的最小值。 缓存异常 缓存雪崩: 缓存雪崩指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉 解决方案: 1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 2.给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存 3.一般并发量不是特别多的时候,使用最多的解决方案是加锁排队 缓存穿透: 缓存穿透值缓存和数据库中都没有的数据,导致所有请求都落到数据库上 解决方案: 1.接口层增加校验 2…对一定不存在的key进行过滤,可以把所有可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。 缓存击穿: 缓存中没有但数据库中有的数据,由于并发用户多,同时读取缓存未读取到数据,同时去数据库读取数据,数据库压力过大。 解决方案: 1.热点数据永不过期 2.加互斥锁 缓存预热: 相关缓存数据直接加载到缓存系统 解决方案: 1.定时缓存刷新 2.数据量不大,可以项目启动自动加载 缓存降级: 服务出现问题,不影响核心服务,对其他服务进行降级处理。 Redis存储过程 首先建立与Redis服务器端的连接用set方法将字符串存放到redis中set可以用覆盖的方式修改已存在的值get方法可以读取存入的值,delete方法可以存储存入的值 Redis集群 六.Nginx 什么是Nginx? Nginx是一个web服务器和方向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议。 Nginx的优点有哪些? 占内存小,可实现高并发连接,处理响应快 可实现http服务器、虚拟主机、方向代理、负载均衡 Nginx配置简单 Nginx内置的健康检查功能 Nginx处理请求? nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址 server { # 第一个Server区块开始,表示一个独立的虚拟主机站点 listen 80; # 提供服务的端口,默认80 server_name localhost; # 提供服务的域名主机名 location / { # 第一个location区块开始 root html; # 站点的根目录,相当于Nginx的安装目录 index index.html index.htm; # 默认的首页文件,多个用空格分开 } # 第一个location区块结果 正向代理和反向代理是什么? 1.正向代理:一个人发送请求直接到达目标的服务器 2.反向代理:请求统一被Nginx接收,nginx反向代理服务器接收到后,按照一定规则分发给后端的业务处理服务器进行处理 使用反向代理服务器的优点是什么? 可以隐藏源服务器的存在和特征,充当互联网云和web服务器之间的中间层 反向代理负载均衡是什么? 单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。 负载均衡算法怎么实现?策略有哪些? 当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。 策略: 1.轮询:每个请求按时间顺序逐一分配到不同的后端服务器 upstream backserver { server 192.168.0.12; server 192.168.0.13; } 2.权重:weight值越大分配到的访问率越高。 upstream backserver { server 192.168.0.12 weight=2; server 192.168.0.13 weight=8; } 3.ip_hash(IP绑定)每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,有效解决动态网页存在的session共享问题 upstream backserver { ip_hash; server 192.168.0.12:88; server 192.168.0.13:80; } 4.fair 5.url哈希:地址绑定 七.jdk1.8特性 Iterator迭代器接口中的forEach()方法:将遍历逻辑与业务逻辑分离 Iterator迭代器是一个对象,工作内容是遍历并选择序列中的对象。可以实现对容器的遍历迭代器的使用:使用Iterator()方法返回一个Iterator,通过next()返回第一个元素。用hasNext判断容器中是否还有其他元素。 接口中可以有静态方法和默认方法java Stream API: 集合批量数据操作新的时间Api: java.time,简化java中使用时间的过程 八.Spring框架 什么是spring 轻量级的控制反转,面向切面的容器框架 轻量级的Java开发框架,为了解决企业级应用开发的业务逻辑层和其他层的耦合问题 spring功能底层依赖它的核心特性:依赖注入(DI)和面向切面编程(AOP) 通过依赖注入和面向接口实现松耦合,基于切面和惯例进行声明式编程,通过切面和模板减少样板式代码。 Spring框架的核心 IOC(控制反转)和AOP(面向切面)和DI(依赖注入) Spring模块 spring core:提供了框架的基本组成部分,包括IOC和DI功能 spring beans: 提供了BeanFactory,Spring将管理对象称为Bean spring context: 提供了框架式的对象访问方法 spring jdbc: 提供了一个JDBC的抽象层,简化JDBC spring aop: 提供了面向切面的编程实现,可以自定义拦截器,切点等 spring Web : 提供了针对web开发的集成特性 Spring框架中用到了哪些设计模式? 1.工厂模式: BeanFactory,用来创建简单对象的实例 2.单例模式: Bean默认为单例模式 3.代理模式: Spring的AOP功能 Spring常用注解: 声明bean的注解 @Component@Service@Respository@Controller 注入bean的注解 @Autowired(Spring提供),通过byType注入@Resource(Java自带),默认通过byName注入可以配合使用@Qualifier注解指定某个具体名称的bean Java配置类相关注解 @Configuration:声明当前类是配置类,相当于xml形式的Spring配置@Bean:注解在方法上,声明当前方法的返回值是一个bean@Configuration:声明当前类是配置类,内部组合了@Component注解@ComponentScan:用于对Component进行扫描 事务注解 @Transaction mvc常用注解 @Controller@RequestMapping:用于映射web请求,包括访问路径和参数@ResponseBody:将方法到的返回值放在response的body内,将数据返回给客户端,方法上没有该注解,会将方法的返回值封装为ModulAndView对象。@RequestBody,用于接收JSON类型的数据@PathVariable用于接收路径参数,比如@RequestMapping(“/hello/{name}”)申明的路径,将注解放在参数中前,即可获取该值,通常作为Restful的接口实现方法。@RestController:结合 @ResponseBody 和 @Controller 注解 Spring框架的好处 1.轻量:Spring 是轻量的,基本的版本大约2MB。 2.控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 3.面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 4.容器:Spring 包含并管理应用中对象的生命周期和配置。 5.MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。 6.事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。 7.异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。 什么是Spring IOC容器? Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。 IOC的理解? Spring IOC 负责创建对象,管理对象(通过将原本程序中手动创建对象的控制权,交由Spring框架来管理IOC的好处是很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 ApplicationContext通常的实现是什么? FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。 DI(依赖注入方式) 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。 Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。 接口注入:对于接口注入来说,如果被注入对象想要 IoC 容器为其注入依赖对象,就必须实现某个接口,这个接口提供了一个方法,用来为其注入依赖对象。但是从注入方式的使用来说,接口注入是现在不提倡的一种方式,基本处于"退役"状态,因为它强制被注入实现对象不必要的依赖。 AOP 的理解 AOP:Aspect Oriented Programming 面向切面编程将与业务无关的,但对多个对象产生公共的影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被称为切面(Accept)AOP的实现在于代理模式,在程序运行的时候通过动态代理或者CGLIB代理的方式织入到核心业务中。切入点(Pointcut):指在哪些类的哪些方法上面织入切面通知(Advice):在方法执行的什么时候做什么增强切面(Accept):切入点加通知,在什么地方,什么时候,做了什么增强织入(Weaving):把切面加入到目标对象中,并创建出目标对象对应的代理对象 什么是Spring beans? Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。 一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。 怎么给Spring容器提供配置元数据? XML配置文件。 基于注解的配置。 基于java的配置。 Spring框架中bean的生命周期? Spring容器 从XML 文件中读取bean的定义,并实例化bean。Spring根据bean的定义填充所有的属性。如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。如果bean实现了 DisposableBean,它将调用destroy()方法。 解释不同方式的自动装配? no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。byName:通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。自动装配的局限性 重写: 你仍需用 和 配置来定义依赖,意味着总要重写自动装配。基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。 Spring MVC概述? Spring提供的web框架。 主要由DispatcherServlet,处理映射器,处理器(控制器),视图解析器,视图组成。 核心: 处理器映射:选择使用哪个处理器来处理请求 视图解析器:选择结果应该如何渲染 运行原理: 1.Http请求:客户提交请求到DispatcherServlet 2.寻找处理器:DispatcherServlet控制器查询一个或多个handlerMapping,找到处理的Controller 3.调用处理器:DispatcherServlet请求提交到Controller 4.调用业务处理和返回结果:Controller调用业务处理逻辑后,返回ModelAndView 5.处理视图映射并返回模型:DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。 6.Http响应:视图负责将结果显示到客户端。 SpringBoot SpringBoot是什么?精简了配置的Spring,使用约定优于配置的原则 SpringBoot启动 java-jar方式启动spring-boot-plugin方式启动,命令行进入项目所在目录,输入命令mvn spring-boot:run启动 SpringBoot优缺点,特性,常用注解优点 简化了依赖的管理,父依赖可以对几乎所有引入的依赖进行版本的统一管理简化部署,省去了打包部署的过程简化监控,特性 自动配置 整合MyBatis时,无需自己配置MapperScannerConfigurer即可实现映射器的注入常用注解 @SpringBootApplication:包含Configuration,@EnableAutoConfiguration,@ComponentScan,用于主类上@RestController:包含@Controller,@ResponseBody@Configuration:Bean配置的信息源@Bean:放在方法上面,产生一个bean交给Spring管理@ConfigurationProperties:读取配置文件中的配置信息。 SpringBoot依赖 父依赖:spring-boot-starter-parentweb依赖:spring-boot-starter-web测试环境相关依赖:spring-boot-starter-test SpringBoot整合RabbitMQ 引入依赖spring-cloud-stream-binder-rabbit配置与RabbitMQ的服务器的连接注入RabbitTemplate的类的实例使用RabbitTemplate完成RabbitMQ客户端与服务器的交互 九.行业分类传统软件行业(传统项目) OA办公自动化系统ERP企业资源管理系统CRM客户关系管理系统CMS内容管理系统 App信息管理系统宿舍管理系统…互联网软件(互联网项目) 电商平台(天猫,京东…)社交平台(QQ,微信…)网络游戏(LOL…)短视频平台金融类平台保险医疗 十.架构 单体式架构: 部署单一 技术单一 系统错误隔离性差 系统可扩展性差 微服务架构 项目复杂度降低 团队界限明确 扩展灵活,并发承受能力强 运维成本较高,复杂性提高。 单体式架构项目提升性能较为困难,需要对整体模块进行提升,较为困难 微服务架构拆分成了独立的模块,扩展较为简单。 设计原则: 围绕业务切分(粗粒度拆分) 单一职责 谁创建,谁负责 微服务常见术语 Provider和Consumer Provider:服务提供者,提供数据服务,(部分Service和DAO的集合) Consumer:服务消费者,消费数据服务(Controller和部分Service集合) RPC和Restful RPC:远程过程调用(远程过程调用的形式/(自己的协议)来实现数据传输) Resuful:一种HTTP协议风格(GET:查询;POST:新增;PUT:修改;DELETE:删除) 注册中心(为了解决不同服务,分布式项目之间的地址获取问题) 分布式系统: 分开部署 问题: 分布式session 分布式锁 分布式事务 微服务系统: 对项目业务单元的拆分(细粒度的拆分) 十一.Dubbo 什么是Dubbo? 高性能,轻量级的Java RPC框架,提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,服务自动注册和发现。 Dubbo不是完整的微服务解决方案,只能说是基于Dubbo可以有一套微服务解决方案。 Dubbo中的角色节点Provider:暴露服务的服务提供方 Consumer:调用远程服务的服务消费方 Registry:服务注册与发现的注册中心(推荐使用zookeeper) Monitor:统计服务的调用次数和调用时间的监控中心 Container:服务运行服务器 Dubbo配置方式: 1.Spring配置方式 2.Java API配置方式 service:服务配置 reference:引用配置 protocol:协议配置 application:应用配置 module:模块配置 registry:注册中心配置 monitor:监控中心配置 provider:提供方配置 consumer:消费方配置 method:方法配置 argument:参数配置 Dubbo优点? 1.面向接口代理的高性能RPC调用 2.智能负载均衡 3.服务自动注册与发现 4.高度可扩展能力 5.运行期流量调度 6.可视化的服务治理与运维 十二.Spring Cloud 什么是Spring Cloud? Spring Cloud是一套完整的微服务解决方案。 Spring公司基于Netflix(网飞)开源的一套微服务组件来进行Spring Cloud开发。 Spring Boot是为了更好的服务微服务项目。 十三.MyBatis MyBatis配置文件及其作用? properties:引入数据库属性文件setting:MyBatis配置文件typeAliases:别名配置environments:配置运行环境transactionManager:事务管理器DataSource:配置数据源:连接池mappers:引入mapper映射文件 十四.Java web ServletServlet:(Server Applet)运行在服务器上的一个小程序,用来处理服务器请求 jsp和Servlet有什么区别?jsp善于表现于页面展示,Servlet善于逻辑控制 jsp是Servlet的简化,Servlet是一个完整的Java类。 jsp的4种作用域? pagerequestsessionapplication 常见异常类型 NullPointExceptionSQLExceptionIndexOutOfBoundsExceptionNumberFormatExceptionFileNotFoundExceptionIOExceptionClassCastExceptionArithmeticException 十五.MySQL 什么是索引 索引是一种数据结构,帮助我们快速检索数据库中的数据。 索引数据结构?Hash索引和B+Tree索引 Hash索引适合等值查询,无法进行范围查询。 Hash索引无法利用索引完成排序。 Hash索引不支持多列联合索引的最左侧匹配规则 数据库存储过程 大数据的四V和三高 大数据的典型特征 高可扩高性能高并发 四V Volume:数据体量大Variety:数据类型繁多Value:价值密度低Velocity:处理速度快 十六.MQ 什么是消息中间件? 消息队列是异步rpc的主要手段之一。 什么是消息队列 消息队列是一种可以存储,传递消息的容器,常用语分布式系统中减轻服务器压力,有顺序 MQ的好处 通过异步处理提高系统性能和削峰,降低耦合性 流行的MQ RabbitMQRocketMQKafkaActiveMQ ActiveMQ的通讯方式 publish(发布)-subscribe(订阅)发布-订阅方式point-to-point(点对点方式) RPC是什么? rpc:远程过程调用 RPC核心 远程提供者需要以某种形式服务调用相关的信息,包括但不限于服务接口定义,数据结构,或者中间件的服务定义文件。远程代理对象:服务调用者用的服务实际上是远程服务的本地代理。通信:rpc框架与具体的协议无关序列化:远程通信,需要将对象转换为二进制流进行传输。 分布式 什么是分布式事务?常见的解决方案 分布式事务:将一个操作中涉及到的所有数据库实例的数据库操作捆绑为一个整体进行管理,执行成功,操作中的所有就数据库实例的数据库操作均被提交,遇到错误且必须取消或回滚,所有涉及到的数据库操作都需恢复到操作前的状态,所有数据均清除。 项目中Redis实现分布式锁 验证前端的重复请求,通过redis过滤。每次请求先在redis中检索有没有这个key,来验证是否一定时间内重复提交。秒杀系统,Redis是单线程,防止出现数据库爆破。全局增量ID生成 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |