目录
12.String、StringBuilder、StringBuffer的区别?
28. 父子类静态代码块, 非静态代码块, 构造方法执行顺序
34.BeanFactory 和 ApplicationContext 有什么区别
39.当一个线程进入一个对象的一个synchronized 方法后,其它线程是否可进入此对象的其它方法?
49.HashMap,HashTable,LinkedHashMap之间的区别
1.#{}和${}的区别是什么?
- #{}是预编译处理,${}是字符串替换。
- Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值;使用#{}可以有效的防止 SQL 注入,提高系统安全性。
- Mybatis 在处理${}时,就是把${}替换成变量的值。
2.为什么代码会重排序?
在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是
不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件:
在单线程环境下不能改变程序运行的结果;
存在数据依赖关系的不允许重排序
需要注意的是:重排序不会影响单线程环境的执行结果,但是会破坏多线程的执
行语义。
3.什么是线程池? 为什么要使用它?
-
在程序启动的时候创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。
- 使用线程池可以重复利用已有的线程继续执行任务,避免线程在创建销毁时造成的消耗
- 由于没有线程创建和销毁时的消耗,可以提高系统响应速度
- 通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小等
4.单例模式的线程安全性
- 单例模式:某个类的实例在多线程环境下只会被创建一次出来。
- 1)、饿汉式单例模式:线程安全,一开始就初始化
- 2)、懒汉式单例模式:非线程安全,延迟初始化
- 3)、双检锁单例模式:线程安全,延迟初始化
5.为什么要用 Redis /为什么要用缓存?
- 高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可
- 高并发: 直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
6.docker常用命令有哪些?
- docker pull 拉取或者更新指定镜像
- docker push 将镜像推送至远程仓库
- docker rm 删除容器
- docker rmi 删除镜像
- docker images 列出所有镜像
- docker ps 列出所有容器
7.负载均衡的意义是什么?
在计算中,负载均衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载均衡旨在优化资源使用,最大吞吐量,最小响应时间并避免任何单一资源的过载。使用多个组件进行负载均衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务进程。
8.ApplicationContext通常的实现是什么?
- FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
- ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。
- WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。
9.Spring 框架中都用到了哪些设计模式?
- 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
- 单例模式:Bean默认为单例模式。
- 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
- 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
10.Spring框架中有哪些不同类型的事件?
- 上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
- 上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
- 上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
- 上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
- 请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。
11.抽象类和接口的区别?
- 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。
- main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符
12.String、StringBuilder、StringBuffer的区别?
- String 字符串常量
- StringBuffer 字符串变量(线程安全)
- StringBuilder 字符串变量(非线程安全)
- String 中的 String 类中使用 final 关键字修饰字符数组来保存字符串,private final char value[] ,String 对象是不可变的,也就可以理解为常量,线程安全。
- AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。
- StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
- StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
小结:
- (1)如果要操作少量的数据用 String;
- (2)多线程操作字符串缓冲区下操作大量数据用 StringBuffer;
- (3)单线程操作字符串缓冲区下操作大量数据用 StringBuilder。
13.包装类,装箱,拆箱,Integer的值的缓存范围?
- 包装类即使把基本类型变成对象类型;
- 自动根据数值创建对应的Integer对象,这就是装箱;
- 自动将包装器类型转换为基本数据类型,这就是拆箱;
- Integer的值的缓存范围为-128~127。
对于Integer、Short、Byte、Character、Long类型的valueOf方法,参数如果是-128~127之间的值会直接返回内部缓存池中已经存在对象的引用,参数是其他范围值则返回新建对象(Integer=100,这样的赋值会调用valueOf方法)
Integer a=128,Integer b=128 boolean res=(a==b) res为false, 当 a,b都为 -128~127之间的某数时,res为true
14.简述面向对象和面向过程?
(1)从设计思路来看。
- 面向过程:程序设计的重点是分析解决问题的步骤,以及完成步骤的流程,是一种结构化自上而下的程序设计方法。
- 面向对象:程序设计的重点是把构成问题的事物分解成对象,从局部着手,通过迭代的方式逐步构建出整个程序,是一种以数据为核心,以类设计为主的自下而上的程序设计方法。
(2)从适用范围来看。
- 面向过程:由于不涉及实例化对象等操作,程序性能更高,开销更少,因此像切入式等对资源要求较高的系统大多都采用面向过程开发。
- 面向对象:由于其抽象、封装、继承、多态的特性,使得系统具有更好的扩展性、维护性、复用性,对于功能复杂且维护成本较高的系统采用面向对象的开发。
(3)从代码复用来看。
- 二者都可以实现代码复用,但是面向过程主要是函数,而面向对象主要是类。
15.简述方法的重写和重载?
- 重载: 发生在同一个类中,方法名必须相同,参数类型不同.个数不同.顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
- 重写: 发生在父子类中,方法名.参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
16.简述一下你理解docker?
Docker是一套轻量级操作系统虚拟化解决方案,它由go语言编写。它基于Linux容器技术(LXC),Namespace,Cgroup,UnionFS(联合文件系统)等技术。
namespace(命名空间):命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。docker实际上一个进程容器,它通过namespace实现了进程和进程所使用的资源的隔离。使不同的进程之间彼此不可见。我们可以把Docker容器想像成进程+操作系统除内核之外的一套软件。
cgroup(控制组):是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。控制组技术最早是由 Google 的程序员 2006 年起提出,Linux 内核自 2.6.24 开始支持。控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对 文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。Docker 中使用的 AUFS(AnotherUnionFS)就是一种 Union FS。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker 目前支持的 Union 文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper。
Docker的生命周期包含三个部分,镜像,容器,仓库,我们可以把镜像,容器想像成java的类和对象,即容器是由镜像实例化而来的。也就是说我们想使用装有相关软件的镜像,首先要把镜像创建成容器。现在是不是对镜像,容器,仓库这些概念还存在一些困惑?那么让我们动手体验一下docker的神奇,然后慢慢理解这些概念。
17.String 类的常用方法都有那些?
- indexOf():返回指定字符的索引。
- length():返回字符串长度。
- equals():字符串比较。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():分割字符串,返回一个分割后的字符串数组。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- substring():截取字符串。
String s = "abc";,这是常量,放常量池管理。
不建议频繁对String修改,因为会产生内存碎片。
如果要频繁对字符串修改,建议采用StringBuffer 和 StringBuilder
18.动态代理是什么?有哪些应用?
- 当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等,就可以给这个类创建一个代理,这个代理类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦合性。动态代理的应用,非常典型就Spring 里的AOP,以及各种注解
19.浏览器输入url发生了什么:
- DNS域名解析
- 建立Tcp连接
- 发起Http请求
- 接受响应结果
- 浏览器解析html
- 浏览器布局渲
20.redis宕机之后,redis值会失效吗?
- 不会,redis有持久化机制,默认开启rdb机制,rdb方式是在一定时间内,key和value的修改次数达到一定值后才会去做持久化,所以rdb可能会造成数据的丢失。rdb方式当redis断开连接后会自动做备份,kill 9和断电除外。
- 如果想保证数据尽量不丢失,最好采用aof方式,aof是实时进行保存(aof性能没有rdb高,rdb使用单独的子进程进行持久化)
21. 什么是内存泄漏和内存溢出!
- 内存泄漏(memoryleak),是指应用程序在申请内存后,无法释放已经申请的内存空间,一次内存泄漏危害可以忽略,但如果任其发展最终会导致内存溢出(outofmemory)。如读取 文件后流要进行及时的关闭以及对数据库连接的释放。
- 内存溢出(outofmemory)是指应用程序在申请内存时,没有足够的内存空间供其使用。如我们在项目中对于大批量数据的导入,采用分批量提交的方式。
22.说一说常见的Execption和解决方案!
1).数组越界异常 : Java.lang.ArrayIndexOutofBoundsException
产生的原因:访问了不存在的索引
解决的办法:索引0到数组长度-1的范围内取值
2).空指针异常 : Java.lang.NullPointerException
产生的原因:对象没有创建就访问了元素或者方法或者属性
解决的办法: 先找出出现的所有引用类型,判断哪个对象是没有new的元素或者方法或者属性,如
果没有就创建该对象
3).没有这样的元素异常 : Java.util.NoSuchElementException
产生的原因:在迭代器迭代的时候没有下一个元素了
解决的办法:在迭代器之前做相对应得判断,如果没有元素了就不迭代输出了
4).并发修改异常 : Java.util.ConcurrentModificationException
产生的原因:在迭代器迭代的同时使用集合修改元素
解决的办法:使用普通for循环来遍历 , 使用toArray来遍历 , 使用ListIterator来遍历
5).类型转换异常 : Java.lang.ClassCastException
产生的原因:在向下转型的过程中,没有转换成真实的类型
解决的方法:在向下转型之前使用instanceof关键字对所有子类做逐一判断
6).算法出错异常 : Java.lang.ArithmeticException
产生的原因:除数不能为零
解决的办法:改变除数的结果再进行测试
7).没有序列化异常 : Java.io.NotSerialzableException
产生的原因:没有实现serializable接口
解决的办法:对需要的写入到文件的类实现serializable接口,表示允许该类的该类写入到文件
23. 什么是反射, 反射的好处?
Java 动态执行机制,可以实现动态执行功能:
- 反射提供了在运行时判断任意一个对象所属的类型,并可以检查解析类型的内部结构。
- 反射可以动态加载类型,并能够动态创建对象
- 反射可以动态访问对象的属性。
- 反射可以动态执行对象的方法。
- 利用反射API还可以动态的访问,不可见的属性和方法
- 优点:可以动态执行!在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
24. 事务控制在哪一层? 可否控制在dao层? 为什么?
- 事务必须控制在service层, 不可以在dao层.
- 因为dao层需要按照单一职责原则设计, 一个类对应一张表, 类中最好都是单表增删改查, 增加代码复用率而事务具有隔离性, service会调用多个dao方法组装业务, 如果事务控制在dao层就会被分隔成多个事务, 无法整体控制
- 所以事务必须控制在service层, 保证一套业务操作要么全成功, 要么全失败.
25. Cookie和session的区别和联系?
- Cookie是客户端浏览器用来保存数据的一块空间, cookie没有session安全, cookie中保存的数据量有大小限制
- Session是服务器端用来保存数据的一块空间, session比较安全
Cookie和session联系:
当用户第一次发送请求访问网站的时候, cookie中没有信息, 这个时候服务器就会生成一个session
对象, 这个session对象有个唯一id叫做sessionID, 这个id会被保存到用户的浏览器cookie中.
当用户再次访问服务器的时候, cookie中就会有sessionID, 会被带到服务器, 服务器会根据这个id找
到对应的session对象使用.
如果服务器没有找到对应的session对象则会新生成一个session对象, 然后将新的session对象的id
再次写入到cookie中保存.
26. —个线程两次调用start。方法会出现什么情况?
- Java的线程是不允许启动两次的,第二次调用必然会抛出legalThreadStateException,这是一种运行时异常,多次调用 start 被认为是编程错误。
27. 如何实现对象克隆
- 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
- 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
28. 父子类静态代码块, 非静态代码块, 构造方法执行顺序
- 父类 - 静态代码块
- 子类 - 静态代码块
- 父类 - 非静态代码
- 父类 - 构造函数
- 子类 - 非静态代码
- 子类 - 构造函数
29. jsp 和 servlet 有什么区别?
- jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别Java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的Java类)
- jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。
30. 如何快速的复制一张表!
- 将表结构和数据导出成sql脚本文件, 可以根据要求修改脚本中的表名字防止重名, 然后再导入到mysql中
- 在库中创建新表后, 使用insert into 表名(字段名) select 字段名 from 表名.
31.List 和 Map、Set 的区别
- List 和 Set 是存储单列数据的集合,Map 是存储键值对这样的双列数据的集合;
- List 中存储的数据是有顺序的,并且值允许重复;
- Map 中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;
- Set 中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的 hashcode 决定,即位置是固定的(Set 集合是根据 hashcode 来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无序的)
32. 什么是 HTTP 协议?
- 客户端和服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。
- 是一个基于请求与响应模式的、无状态的、应用层的协议,基于 TCP 的连接方式
33. 数据库三范式
- 第一范式:1NF 原子性,列或者字段不能再分,要求属性具有原子性,不可再分解;
- 第二范式:2NF 唯一性,一张表只说一件事,是对记录的惟一性约束,要求记录有惟一标识,
- 第三范式:3NF 直接性,数据不能存在传递关系,即每个属性都跟主键有直接关系,而不是间接关系。
34.BeanFactory 和 ApplicationContext 有什么区别
- BeanFactory: Spring 最顶层的接口,实现了 Spring 容器的最基础的一些功能, 调用起来比较麻烦, 一般面向 Spring 自身使用。BeanFactory 在启动的时候不会去实例化 Bean,从容器中拿 Bean 的时候才会去实例化
- ApplicationContext: 是 BeanFactory 的子接口,扩展了其功能, 一般面向程序员身使用。ApplicationContext 在启动的时候就把所有的 Bean 全部实例化了
35.SpringCloud 是什么?
- SpringCloud 是一系列框架的集合,集成 SpringBoot,提供很多优秀服务:服务发现和注册,统一配置中心, 负载均衡,网关, 熔断器等的一个微服务治理框架
36. 什么是反向代理?
- 反向代理是指以代理服务器来接受 internet 上的连接请求,然后将请求,发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
- 反向代理总结就一句话:代理端代理的是服务端
37. 什么是正向代理?
- 一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
- 正向代理总结就一句话:代理端代理的是客户端。
38.java 中会存在内存泄漏吗,请简单描述。
- 会;存在无用但可达的对象,这些对象不能被GC 回收,导致耗费内存资源。
39.当一个线程进入一个对象的一个synchronized 方法后,其它线程是否可进入此对象的其它方法?
- 其它线程只能访问该对象的其它非同步方法,同步方法则不能进入。
40.队列和栈是什么,列出它们的区别?
- 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
- 栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
- 队列先进先出(FIFO),栈先进后出(FILO)。
41. SERVLET的生命周期
- 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.
- 在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
42. 关系型数据库的三范式
- 范式就是规范,就是关系型数据库设计表时遵循的三个规范.要满足第二范式,必须先满足第一范式,要满足第三范式,必须先满足第二范式
- 第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。列数据的不可分割.
- 第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识.(主键)
- 第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(外键)
43. 简单说一下对MVC框架的理解
- 是为了解决传统的MVC模式(jsp+servlet+javabean)问题而出现的框架.
传统MVC模式问题
- 所有的servlet和servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,并且不能实现模块化管理.
- Servlet的主要功能就是接受参数,调用逻辑,跳转页面,比如像其他字符编码,文件上传等功能也要写在servlet中,不能让servlet功能单一.
- 接受参数比较麻烦,不能通过model接收,只能单个接收,接收完成后转换封装进model.
- 跳转页面方式比较单一(forward,redirect),并且当页面名称发生变化时,需要修改servlet源代码.
- 常用的MVC框架:struts2,springMVC
44. AOP是什么?都用它做什么?
- AOP:面向切面编程
- 核心原理:使用动态代理的方式在执行前后或出现异常后做加入相关逻辑.
- 我们主要使用AOP来做: 事务处理 执行方法前,开启事务,执行方法后提交事务,出现异常后回滚事务
- 权限判断 在执行方法前,判断是否具有权限
- 日志记录 在执行方法前执行日志
45. LINUX常用命令
- Cd跳转到目录
- Pwd 获取当前路径
- Su 切换用户
- Ll 查看当前目录下文件和目录
- Tail 查看文件
- Rm –rf 删除文件
- Vi 修改文件
- Mv 移动/重命名 文件或文件夹
- Mkdir 创建文件夹
- Rm –f 删除文件夹
- Tar 打包/解压
- Grep 查找想要的信息
46.Arraylist和Linkedlist区别
- ArrayList动态数组的数据结构,内存存储地址是连续的,有索引更适合查询,ArrayList初始容量为10,每次扩容会固定为之前的1.5倍;
- LinkedList基于链表的数据结构,首位添加(删除)元素,LnkedList性能远远优于ArrayList
47.对缓存的理解?
- 缓存能让原本打开很慢的页面,变得能“秒开”;
- 缓存是基于内存去建立的,内存读写速度比硬盘快,能大大提高访问数据的速度。
- 预读取:先将硬盘中的一部分加载到内存,然后再对外提供服务,减轻数据库访问量。
- 延迟写:先将需要写入磁盘或数据库的数据,暂时写入到内存,然后返回成功,再定时将内存中的数据批量存入到磁盘。
48.组与链表的区别
- 数组:相同数据类型的元素按一定顺序排列的集合;数组的存储区间是连续的,占用内存比较大;数组的特点是:随机访问性强,查询简单速度快,从头尾增加和删除困难;
- 链表:是一种物理存储单元上非连续、非顺序的存储结构,链表存储区间离散,占用内存比较宽松链表的特点是:查询相对于数组困难,增加和删除容易。
49.HashMap,HashTable,LinkedHashMap之间的区别
- HashMap:线程不安全,允许key值为null
- HashTable:线程安全,不允许空值
- LinkedHashMap:集成了HashMap的特点,并保留了插入时的顺序
50.nacos如何进行注册
- 下载nacos并成功启动,进入登录页面进行登录
- 在服务提供方和服务消费方的父工程中引入服务注册依赖
- 分别给两服务的配置文件汇总添加naocs服务地址
- 两服务的启动类上添加注解@EnableDiscoveryClient,注册nacos
51.spring 事务实现方式有哪些?
- 编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
- 基于 TransactionProxyFactoryBean 的声明式事务管理; 基于 @Transactional 的声明式事务管理; 基于 Aspect AOP 配置事务
52.spring mvc 有哪些组件?
- DispatcherServlet:中央控制器,把请求给转发到具体的控制类
- Controller:具体处理请求的控制器
- HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
- ModelAndView:服务层返回的数据和视图层的封装类
- ViewResolver:视图解析器,解析具体的视图
- Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作
53. 什么是 spring boot?
- 在Spring框架这个大家族中,产生了很多衍生框架,比如 Spring、SpringMvc框架等,Spring的核心内容在于控制反转(IOC)和依赖注入(DI),所谓控制反转并非是一种技术,而是一种思想,在操作方面是指在spring配置文件中创建<bean>,依赖注入即为由spring容器为应用程序的某个对象提供资源,比如 引用对象、常量数据等。
- SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且繁琐的配置文件,所以 SpringBoot是一个服务于框架的框架,服务范围是简化配置文件。
54.什么是 spring cloud?
-
从字面理解,Spring Cloud 就是致力于分布式系统、云服务的框架。
-
Spring Cloud 是整个 Spring 家族中新的成员,是最近云服务火爆的必然产物。
-
Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如:
- 配置管理服务注册与发现
- 断路器
- 智能路由
- 服务间调用
- 负载均衡
- 微代理
- 控制总线
- 一次性令牌
- 全局锁
- 领导选举
- 分布式会话
- 集群状态
- 分布式消息
- 使用 Spring Cloud 开发人员可以开箱即用的实现这些模式的服务和应用程序。
- 这些服务可以任何环境下运行,包括分布式环境,也包括开发人员自己的笔记本电脑以及各种托管平台。
55.什么是Spring IOC
Spring的控制反转:把一个类放入到spring容器中,对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。
56.MyBatis应用中#与$有什么区别
#能够有效防止SQL的注入攻击,并且是预编译的SQL
#还能够江传入的数值当成一个字符串,会对自动传入的数据加上一个双引号。
如:where name=#{name} 如果传入的值是jack,那么解析成的SQL是:where name="jack"
$会将传入的值直接显示在sql中,会导致异常 并且不能防止sql的攻击,且相对低效
57.说一下乐观锁和悲观锁?
- 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
- 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
- 数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。
58. redis 是什么?都有哪些使用场景?
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis 使用场景:
- 数据高并发的读写
- 海量数据的读写
- 对扩展性要求高的数据
59.redis 有哪些功能?
- 数据缓存功能
- 分布式锁的功能
- 支持数据持久化
- 支持事务
- 支持消息队列
60. redis 持久化有几种方式?
Redis 的持久化有两种方式,或者说有两种策略:
RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
AOF(Append Only File):每一个收到的写命令都通过write函数追加到文件中。
61.Mybatis 和 Mybatis Plus 的区别
MyBatis:
- 所有SQL语句全部自己写
- 手动解析实体关系映射转换为MyBatis内部对象注入容器
- 不支持Lambda形式调用
Mybatis Plus:
- 强大的条件构造器,满足各类使用需求
- 内置的Mapper,通用的Service,少量配置即可实现单表大部分CRUD操作
- 支持Lambda形式调用
- 提供了基本的CRUD功能,连SQL语句都不需要编写
- 自动解析实体关系映射转换为MyBatis内部对象注入容器
62.nginx可以用来做什么
1)反向代理:反向代理(ReverseProxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,简单来说就是真实的服务器不能直接被外部网络访问,想要访问必须通过代理。
2)动静分离:运用Nginx的反向代理功能分发请求:所有动态资源的请求交给应用服务器,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻应用服务器的压力
3)负载均衡:负载均衡也是 Nginx常用的一个功能,当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。