java常见的⾯试题(⼀)
1.Collection 和 Collections 有什么区别?
Collection 是⼀个集合接⼝(集合类的⼀个顶级接⼝)。它提供了对集合对象进⾏基本操作的通⽤接⼝⽅法。Collection接⼝在Java 类库中有很多具体的实现。
Collection接⼝的意义是为各种具体的集合提供了最⼤化的统⼀操作⽅式,其直接继承接⼝有List与Set。
Collections则是集合类的⼀个⼯具类/帮助类,其中提供了⼀系列静态⽅法,⽤于对集合中元素进⾏排序、搜索以及线程安全等各种操作。
2.List、Set、Map 之间的区别是什么?
List:有序集合、元素可重复;ArrayList基于数组实现的有序集合;LinkedList基于链表实现的有序集合。
Set:⽆序集合、元素不可重复;LinkHashSet按照插⼊排序-------SortSet可排序----------HashSet⽆序。
Map:键值对集合、储存键、值和之间的映射,Key⽆序,唯⼀;Value不要求有序,允许重复。
3. HashMap 和 Hashtable 有什么区别?
hashMap去掉了HashTable 的contains⽅法,但是加上了containsValue()和containsKey()⽅法。
hashTable同步的,⽽HashMap是⾮同步的,效率上逼hashTable要⾼。
hashMap允许空键值,⽽hashTable不允许。
4. 如何决定使⽤ HashMap 还是 TreeMap?
对于在Map中插⼊、删除和定位元素这类操作,HashMap是最好的选择。然⽽,假如你需要对⼀个有序的key集合进⾏遍历,TreeMap是更好的选择。
基于你的collection的⼤⼩,也许向HashMap中添加元素会更快,将map换为TreeMap进⾏有序key的遍历。
5. 说⼀下 HashMap 的实现原理?
HashMap概述:HashMap是基于哈希表的Map接⼝的⾮同步实现。此实现提供所有可选的映射操作,并允许使⽤null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap的数据结构:在java编程语⾔中,最基本的结构就是两种,⼀个是数组,另外⼀个是模拟指针(引⽤),所有的数据结构都可以⽤这两个基本结构来构造的,HashMap也不例外。HashMap实际上是⼀个“链表散列”的数据结构,即数组和链表当我们往Hashmap中put元素时,⾸先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,
新加⼊的放在链头,最先加⼊的放⼊链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。
需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过⼋个之后,该链表会转为红⿊树来提⾼查询效率,从原来的O(n)到O(logn)
6. 说⼀下 HashSet 的实现原理?
HashSet底层由HashMap实现
HashSet的值存放于HashMap的key上
HashMap的value统⼀为PRESENT
7. ArrayList 和 LinkedList 的区别是什么?
最明显的区别是 ArrrayList底层的数据结构是数组,⽀持随机访问,⽽ LinkedList 的底层数据结构是双向循环链表,不⽀持随机访问。
使⽤下标访问⼀个元素,ArrayList 的时间复杂度是 O(1),⽽ LinkedList 是 O(n)。
8. 守护线程是什么?
守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。
9. 创建线程有哪⼏种⽅式?
①. 继承Thread类创建线程类
定义Thread类的⼦类,并重写该类的run⽅法,该run⽅法的⽅法体就代表了线程要完成的任务。因此把run()⽅法称为执⾏体。
创建Thread⼦类的实例,即创建了线程对象。
调⽤线程对象的start()⽅法来启动该线程。
②. 通过Runnable接⼝创建线程类
定义runnable接⼝的实现类,并重写该接⼝的run()⽅法,该run()⽅法的⽅法体同样是该线程的线程执⾏体。
创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
调⽤线程对象的start()⽅法来启动该线程。
③. 通过Callable和Future创建线程
创建Callable接⼝的实现类,并实现call()⽅法,该call()⽅法将作为线程执⾏体,并且有返回值。
创建Callable实现类的实例,使⽤FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()⽅法的返回值。
使⽤FutureTask对象作为Thread对象的target创建并启动新线程。
调⽤FutureTask对象的get()⽅法来获得⼦线程执⾏结束后的返回值。
10. 线程有哪些状态?
线程通常都有五种状态,创建、就绪、运⾏、阻塞和死亡。
创建状态。在⽣成线程对象,并没有调⽤该对象的start⽅法,这是线程处于创建状态。
就绪状态。当调⽤了线程对象的start⽅法之后,该线程就进⼊了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运⾏之后,从等待或者睡眠中回来之后,也会处于就绪状态。
运⾏状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进⼊了运⾏状态,开始运⾏run函数当中的代码。
阻塞状态。线程正在运⾏的时候,被暂停,通常是为了等待某个时间的发⽣(⽐如说某项资源就绪)之后再继续运⾏。sleep,suspend,wait等⽅法都可以导致线程阻塞。
死亡状态。如果⼀个线程的run⽅法执⾏结束或者调⽤stop⽅法后,该线程就会死亡。对于已经死亡的线程,⽆法再使⽤start⽅法令其进⼊就绪 
11.创建线程池有哪⼏种⽅式?
①. newFixedThreadPool(int nThreads)
创建⼀个固定长度的线程池,每当提交⼀个任务就创建⼀个线程,直到达到线程池的最⼤数量,这时线程规模将不再变化,当线程发⽣未预期的错误⽽结束时,线程池会补充⼀个新的线程。
②. newCachedThreadPool()
创建⼀个可缓存的线程池,如果线程池的规模超过了处理需求,将⾃动回收空闲线程,⽽当需求增加时,则可以⾃动添加新线程,线程池的规模不存在任何限制。
③. newSingleThreadExecutor()
这是⼀个单线程的Executor,它创建单个⼯作线程来执⾏任务,如果这个线程异常结束,会创建⼀个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串⾏执⾏。
④. newScheduledThreadPool(int corePoolSize)
创建了⼀个固定长度的线程池,⽽且以延迟或定时的⽅式来执⾏任务,类似于Timer。 
12.线程池都有哪些状态?
线程池有5种状态:Running、ShutDown、Stop、Tidying、Terminated。
线程池各个状态切换框架图:
13.在 java 程序中怎么保证多线程的运⾏安全?
线程安全在三个⽅⾯体现:
原⼦性:提供互斥访问,同⼀时刻只能有⼀个线程对数据进⾏操作,(atomic,synchronized);
可见性:⼀个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
有序性:⼀个线程观察其他线程中的指令执⾏顺序,由于指令重排序,该观察结果⼀般杂乱⽆序,(happens-before原则)。
14.在 java 程序中怎么保证多线程的运⾏安全?
在Java中,锁共有4种状态,级别从低到⾼依次为:⽆状态锁,偏向锁,轻量级锁和重量级锁状态,这⼏个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。
锁升级的图⽰过程:
15.什么是死锁?
死锁是指两个或两个以上的进程在执⾏过程中,由于竞争资源或者由于彼此通信⽽造成的⼀种阻塞的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。
此时称系统处于死锁状态或系统产⽣了死锁,这些永远在互相等待的进程称为死锁进程。是操作系统层⾯的⼀个错误,是进程死锁的简称,
最早在 1965 年由 Dijkstra 在研究银⾏家算法时提出的,它是计算机操作系统乃⾄整个并发程序设计领域最难处理的问题之⼀。
15.怎么防⽌死锁?
死锁的四个必要条件:
互斥条件:进程对所分配到的资源不允许其他进程进⾏访问,若其他进程访问该资源,只能等待,直⾄占有该资源的进程使⽤完成后释放该资源
请求和保持条件:进程获得⼀定的资源之后,⼜对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但⼜对⾃⼰获得的资源保持不放
不可剥夺条件:是指进程已获得的资源,在未完成使⽤之前,不可被剥夺,只能在使⽤完后⾃⼰释放
环路等待条件:是指进程发⽣死锁后,若⼲进程之间形成⼀种头尾相接的循环等待资源关系
这四个条件是死锁的必要条件,只要系统发⽣死锁,这些条件必然成⽴,⽽只要上述条件之⼀不满⾜,就不会发⽣死锁。
理解了死锁的原因,尤其是产⽣死锁的四个必要条件,就可以最⼤可能地避免、预防和解除死锁。
所以,在系统设计、进程调度等⽅⾯注意如何不让这四个必要条件成⽴,如何确定资源的合理分配算法,避免进程永久占据系统资源。
此外,也要防⽌进程在处于等待状态的情况下占⽤资源。因此,对资源的分配要给予合理的规划。
16.ThreadLocal 是什么?有哪些使⽤场景?
线程局部变量是局限于线程内部的变量,属于线程⾃⾝所有,不在多个线程间共享。Java提供ThreadLocal类来⽀持线程局部变量,是⼀种实现线程安全的⽅式。
但是在管理环境下(如 web 服务器)使⽤线程局部变量的时候要特别⼩⼼,在这种情况下,⼯作线程的⽣命周期⽐任何应⽤变量的⽣命周期都要长。
任何线程局部变量⼀旦在⼯作完成后没有释放,Java 应⽤就存在内存泄露的风险。
17.说⼀下 synchronized 底层实现原理?
synchronized可以保证⽅法或者代码块在运⾏时,同⼀时刻只有⼀个⽅法可以进⼊到临界区,同时它还可以保证共享变量的内存可见性。
Java中每⼀个对象都可以作为锁,这是synchronized实现同步的基础:
普通同步⽅法,锁是当前实例对象
静态同步⽅法,锁是当前类的class对象
同步⽅法块,锁是括号⾥⾯的对象
18.synchronized 和 volatile 的区别是什么?
volatile本质是在告诉jvm当前变量在寄存器(⼯作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
volatile仅能使⽤在变量级别;synchronized则可以使⽤在变量、⽅法、和类级别的。
volatile仅能实现变量的修改可见性,不能保证原⼦性;⽽synchronized则可以保证变量的修改可见性
和原⼦性。
volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
19.synchronized 和 Lock 有什么区别?
⾸先synchronized是java内置关键字,在jvm层⾯,Lock是个java类;
synchronized⽆法判断是否获取锁的状态,Lock可以判断是否获取到锁;
synchronized会⾃动释放锁(a 线程执⾏完同步代码会释放锁;b 线程执⾏过程中发⽣异常会释放锁),Lock需在finally中⼿⼯释放锁(unlock()⽅法释放锁),否则容易造成线程死锁;
⽤synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会⼀直等待下去,⽽Lock锁就不⼀定会等待下去,如果尝试获取不到锁,线程可以不⽤⼀直等待就结束了;
synchronized的锁可重⼊、不可中断、⾮公平,⽽Lock锁可重⼊、可判断、可公平(两者皆可);
Lock锁适合⼤量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
20. synchronized 和 ReentrantLock 区别是什么?
synchronized是和if、else、for、while⼀样的关键字,ReentrantLock是类,这是⼆者的本质区别。既然ReentrantLock是类,那么它就提供了⽐synchronized更多更灵活的特性,可以被继承、可以有⽅法、可以有各种各样的类变量,ReentrantLock⽐synchronized的扩展性体现在⼏点上:
ReentrantLock可以对获取锁的等待时间进⾏设置,这样就避免了死锁
ReentrantLock可以获取各种锁的信息
ReentrantLock可以灵活地实现多路通知
另外,⼆者的锁机制其实也是不⼀样的:ReentrantLock底层调⽤的是Unsafe的park⽅法加锁,synchronized操作的应该是对象头中mark word。
21. jsp 有哪些内置对象?作⽤分别是什么?
JSP有9个内置对象:
request:封装客户端的请求,其中包含来⾃GET或POST请求的参数;
response:封装服务器对客户端的响应;
pageContext:通过该对象可以获取其他对象;
session:封装⽤户会话的对象;
application:封装服务器运⾏环境的对象;
out:输出服务器响应的输出流对象;
config:Web应⽤的配置对象;
page:JSP页⾯本⾝(相当于Java程序中的this);
exception:封装页⾯抛出异常的对象。
22. 说⼀下 jsp 的 4 种作⽤域?
JSP中的四种作⽤域包括page、request、session和application,具体来说:
page代表与⼀个页⾯相关的对象和属性。
request代表与Web客户机发出的⼀个请求相关的对象和属性。⼀个请求可能跨越多个页⾯,涉及多个Web组件;需要在页⾯显⽰的临时数据可以置于此作⽤域。
session代表与某个⽤户与服务器建⽴的⼀次会话相关的对象和属性。跟某个⽤户相关的数据应该放在⽤户⾃⼰的session中。
application代表与整个Web应⽤程序相关的对象和属性,它实质上是跨越整个Web应⽤程序,包括多个页⾯、请求和会话的⼀个全局作⽤域。
23. session 和 cookie 有什么区别?
由于HTTP协议是⽆状态的协议,所以服务端需要记录⽤户的状态时,就需要⽤某种机制来识具体的⽤户,这个机制就是Session.典型的场景⽐如购物车,当你点击下单按钮时,由于HTTP协议⽆状态,所以并不知道是哪个⽤户操作的,所以服务端要思考⼀下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上⼤多数的应⽤都是⽤ Cookie 来实现Session跟踪的,第⼀次创建Session的时候,服务端会在HTTP协议中Cookie其实还可以⽤在⼀些⽅便⽤户的场景下,设想你某次登陆过⼀个⽹站,下次登录的时候不想再次输⼊
账号了,怎么办?这个信息可以写到Cookie⾥⾯,访问⽹站的时候,⽹站页⾯的脚本可以读取这个信息,就⾃动帮你把⽤户名给填了,能够⽅24. 说⼀下 session 的⼯作原理?
其实session是⼀个存在服务器上的类似于⼀个散列表格的⽂件。⾥⾯存有我们需要的信息,在我们需要⽤的时候可以从⾥⾯取出来。类似于⼀个⼤号的map吧,
⾥⾯的键存储的是⽤户的sessionid,⽤户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了。
25.如何避免 sql 注⼊?
PreparedStatement(简单⼜有效的⽅法)
使⽤正则表达式过滤传⼊的参数
字符串过滤
JSP中调⽤该函数检查是否包函⾮法字符
JSP页⾯判断代码
26. 什么是 XSS 攻击,如何避免?
XSS攻击⼜称CSS,全称Cross Site Script  (跨站脚本攻击),其原理是攻击者向有XSS漏洞的⽹站中输⼊恶意的 HTML 代码,当⽤户浏览该⽹站时,这段 HTML 代码会⾃动执⾏,从⽽达到攻击的⽬的。
XSS 攻击类似于 SQL 注⼊攻击,SQL注⼊攻击中以SQL语句作为⽤户输⼊,从⽽达到查询/修改/删除数据的⽬的,⽽在xss攻击中,通过插⼊恶意脚本,实现对⽤户游览器的控制,获取⽤户的⼀些信息。
XSS是 Web 程序中常见的漏洞,XSS 属于被动式且⽤于客户端的攻击⽅式。
27. 什么是 CSRF 攻击,如何避免?
CSRF(Cross-site request forgery)也被称为 one-click attack或者 session riding,中⽂全称是叫跨站请求伪造。⼀般来说,攻击者通过伪造⽤户的浏览器的请求,向访问⼀个⽤户⾃⼰曾经认证访问过的⽹站发送出去,使⽬标⽹站接收并误以为是⽤如何避免:
1. 验证 HTTP Referer 字段
HTTP头中的Referer字段记录了该 HTTP 请求的来源地址。在通常情况下,访问⼀个安全受限页⾯的请求来⾃于同⼀个⽹站,⽽如果⿊客要对其实施 CSRF
攻击,他⼀般只能在他⾃⼰的⽹站构造请求。因此,可以通过验证Referer值来防御CSRF 攻击。
2. 使⽤验证码
关键操作页⾯加上验证码,后台收到请求后通过判断验证码可以防御CSRF。但这种⽅法对⽤户不太友好。
3. 在请求地址中添加token并验证
CSRF 攻击之所以能够成功,是因为⿊客可以完全伪造⽤户的请求,该请求中所有的⽤户验证信息都是存在于cookie中,因此⿊客可以在不知道这些验证信息的情况下直接利⽤⽤户⾃⼰的cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 url?csrftoken=tokenvalue。
⽽对于 POST 请求来说,要在 form 的最后加上 <input type="hidden" name="csrftoken" value="tokenvalue"/>,这样就把token以参数的形式加⼊请求了。
4. 在HTTP 头中⾃定义属性并验证
这种⽅法也是使⽤ token 并进⾏验证,和上⼀种⽅法不同的是,这⾥并不是把 token 以参数的形式置
于 HTTP 请求之中,⽽是把它放到 HTTP 头中⾃定义的属性⾥。通过 XMLHttpRequest 这个类,可以⼀次性给所有该类请求加上 csrftoken 这个 HT 28. spring mvc 和 struts 的区别是什么?
拦截机制的不同
Struts2是类级别的拦截,每次请求就会创建⼀个Action,和Spring整合时Struts2的ActionBean注⼊作⽤域是原型模式prototype,然后通过setter,getter吧request数据注⼊到属性。Struts2中,⼀个Action对应⼀个request,response上下⽂,在接收参SpringMVC是⽅法级别的拦截,⼀个⽅法对应⼀个Request上下⽂,所以⽅法直接基本上是独⽴的,独享request,response数据。⽽每个⽅法同时⼜何⼀个url对应,参数的传递是直接注⼊到⽅法中的,是⽅法所独有的。处理结果通过ModeMap返回给Struts2有⾃⼰的拦截Interceptor机制,SpringMVC这是⽤的是独⽴的Aop⽅式,这样导致Struts2的配置⽂件量还是⽐SpringMVC⼤。
底层框架的不同
Struts2采⽤Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采⽤Servlet实现。Filter在容器启动之后即初始化;服务停⽌以后坠毁,晚于Servlet。Servlet在是在调⽤时初始化,先于Filter调⽤,服务停⽌后销毁。
性能⽅⾯
Struts2是类级别的拦截,每次请求对应实例⼀个新的Action,需要加载所有的属性值注⼊,SpringMVC实现了零配置,由于SpringMVC基于⽅法的拦截,有加载⼀次单例模式bean注⼊。所以,SpringMVC开发效率和性能⾼于Struts2。
配置⽅⾯
spring MVC和Spring是⽆缝的。从这个项⽬的管理和安全上也⽐Struts2⾼。
29.解释⼀下什么是 aop?
AOP(Aspect-Oriented Programming,⾯向⽅⾯编程),可以说是OOP(Object-Oriented Programing,⾯向对象编程)的补充和完善。OOP引⼊封装、继承和多态性等概念来建⽴⼀种对象层次结构,⽤以模拟公共⾏为的⼀个集合。当我们需要为分⽽AOP技术则恰恰相反,它利⽤⼀种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共⾏为封装到⼀个可重⽤模块,并将其名为“Aspect”,即⽅⾯。所谓“⽅⾯”,简单地说,就是将那些与业务⽆关,却为业务模块所共同调⽤的使⽤“横切”技术,AOP把软件系统分为两个部分:核⼼关注点和横切关注点。业务处理的主要流程是核⼼关注点,与之关系不⼤的部分是横切关注点。横切关注点的⼀个特点是,他们经常发⽣在核⼼关注点的多处,⽽各处都基本相似。⽐如权限认证30. 解释⼀下什么是 ioc?
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。
1996年,Michael Mattson在⼀篇有关探讨⾯向对象框架的⽂章中,⾸先提出了IOC 这个概念。对于⾯向对象设计及编程的基本思想,前⾯我们已经讲了很多了,不再赘述,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,IOC理论提出的观点⼤体是这样的:借助于“第三⽅”实现具有依赖关系的对象之间的解耦。如下图:
⼤家看到了吧,由于引进了中间位置的“第三⽅”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三⽅”了,全部对象的控制权全部上缴给“第三⽅”IOC容器,所以,IOC容器成了整个系统的关键核⼼,它起到我们再来做个试验:把上图中间的IOC容器拿掉,然后再来看看这套系统:
我们现在看到的画⾯,就是我们要实现整个系统所需要完成的全部内容。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫⽆联系,这样的话,当你在实现A的时候,根本⽆须再去考虑B、C和D了,对象之间的依赖关系已经降低到了我们再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对⽐⼀下:
软件系统在没有引⼊IOC容器之前,如图1所⽰,对象A依赖于对象B,那么对象A在初始化或者运⾏到某⼀点的时候,⾃⼰必须主动去创建对象B或者使⽤已经创建的对象B。⽆论是创建还是使⽤对象B,控制权都在⾃⼰⼿上。
软件系统在引⼊IOC容器之后,这种情形就完全改变了,如图3所⽰,由于IOC容器的加⼊,对象A与对象B之间失去了直接联系,所以,当对象A运⾏到需要对象B的时候,IOC容器会主动创建⼀个对象B注⼊到对象A需要的地⽅。
通过前后的对⽐,我们不难看出来:对象A获得依赖对象B的过程,由主动⾏为变为了被动⾏为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
31. spring 常⽤的注⼊⽅式有哪些?
Spring通过DI(依赖注⼊)实现IOC(控制反转),常⽤的注⼊⽅式主要有三种:
构造⽅法注⼊
setter注⼊
基于注解的注⼊
32. spring 中的 bean 是线程安全的吗?
Spring容器中的Bean是否线程安全,容器本⾝并没有提供Bean的线程安全策略,
因此可以说spring容器中的Bean本⾝不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。
33. spring ⽀持⼏种 bean 的作⽤域?
当通过spring容器创建⼀个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作⽤域。Spring⽀持如下5种作⽤域:
singleton:单例模式,在整个Spring IoC容器中,使⽤singleton定义的Bean将只有⼀个实例
prototype:原型模式,每次通过容器的getBean⽅法获取prototype定义的Bean时,都将产⽣⼀个新的Bean实例
request:对于每次HTTP请求,使⽤request定义的Bean都将产⽣⼀个新实例,即每次HTTP请求将会产⽣不同的Bean实例。只有在Web应⽤中使⽤Spring时,该作⽤域才有效
session:对于每次HTTP Session,使⽤session定义的Bean⾖浆产⽣⼀个新实例。同样只有在Web应⽤中使⽤Spring时,该作⽤域才有效
globalsession:每个全局的HTTP Session,使⽤session定义的Bean都将产⽣⼀个新实例。典型情况下,仅在使⽤portlet context的时候有效。同样只有在Web应⽤中使⽤Spring时,该作⽤域才有效
其中⽐较常⽤的是singleton和prototype两种作⽤域。对于singleton作⽤域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的⽣命周期⾏为;如果⼀个Bean被设置成prototype作⽤域,程序每次请求如果不指定Bean的作⽤域,Spring默认使⽤singleton作⽤域。Java在创建Java实例时,需要进⾏内存申请;销毁实例时,需要完成垃圾回收,这些⼯作都会导致系统开销的增加。因此,prototype作⽤域Bean的创建、销毁代价⽐较⼤。⽽singleton作
34. spring 事务实现⽅式有哪些?
编程式事务管理对基于 POJO 的应⽤来说是唯⼀选择。我们需要在代码中调⽤beginTransaction()、commit()、rollback()等事务管理相关的⽅法,这就是编程式事务管理。
基于 TransactionProxyFactoryBean 的声明式事务管理
基于 @Transactional 的声明式事务管理
基于 Aspectj AOP 配置事务
35. spring 事务隔离级别有哪些?
事务隔离级别指的是⼀个事务对数据的修改与另⼀个并⾏的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发⽣以下问题:
脏读:⼀个事务读到另⼀个事务未提交的更新数据。
幻读:例如第⼀个事务对⼀个表中的数据进⾏了修改,⽐如这种修改涉及到表中的“全部数据⾏”。同时,第⼆个事务也修改这个表中的数据,这种修改是向表中插⼊“⼀⾏新数据”。那么,以后就会发⽣操作第⼀个事务的⽤户发现表中还存在没有修改的不可重复读:⽐⽅说在同⼀个事务中先后执⾏两条⼀模⼀样的select语句,期间在此次事务中没有执⾏过任何DDL语句,但先后得到的结果不⼀致,这就是不可重复读。
36.说⼀下 spring mvc 运⾏流程?
Spring MVC运⾏流程图:
Spring运⾏流程描述:
1. ⽤户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
java线程池创建的四种2. DispatcherServlet对请求URL进⾏解析,得到请求资源标识符(URI)。然后根据该URI,调⽤HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的),最后以HandlerExecutionChain对象的形式返
3. DispatcherServlet 根据获得的Handler,选择⼀个合适的HandlerAdapter;(附注:如果成功获得HandlerAdapter后,此时将开始执⾏的preHandler(...)⽅法)
4.  提取Request中的模型数据,填充Handler⼊参,开始执⾏Handler(Controller)。在填充Handler的⼊参过程中,根据你的配置,Spring将帮你做⼀些额外的⼯作:
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成⼀个对象,将对象转换为指定的响应信息
数据转换:对请求消息进⾏数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进⾏数据格式化。如将字符串转换成格式化数字或格式化⽇期等
数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5.  Handler执⾏完成后,向DispatcherServlet 返回⼀个ModelAndView对象;
6.  根据返回的ModelAndView,选择⼀个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图;
8. 将渲染结果返回给客户端。
37.什么是 spring boot,它有什么有点?
在Spring框架这个⼤家族中,产⽣了很多衍⽣框架,⽐如 Spring、SpringMvc框架等,Spring的核⼼内容在于控制反转(IOC)和依赖注⼊(DI),所谓控制反转并⾮是⼀种技术,⽽是⼀种思想,在操作⽅⾯是指在spring配置⽂件中创建<bean>,依赖注⼊即SpringBoot是⼀个框架,⼀种全新的编程规范,他的产⽣简化了框架的使⽤,所谓简化是指简化了Spring众多框架中所需的⼤量且繁琐的配置⽂件,所以 SpringBoot是⼀个服务于框架的框架,服务范围是简化配置⽂件。
优点:
Spring Boot使编码变简单
Spring Boot使配置变简单
Spring Boot使部署变简单
Spring Boot使监控变简单
38.spring boot 有哪些⽅式可以实现热部署?
SpringBoot热部署实现有两种⽅式:
①. 使⽤spring loaded
在项⽬中添加如下代码:
<build>
<plugins>
<plugin>
<!-- springBoot编译插件-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<!-- spring热部署 -->
<!-- 该依赖在此处下载不下来,可以放置在build标签外部下载完成后再粘贴进plugin中 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
添加完毕后需要使⽤mvn指令运⾏:
⾸先到IDEA中的Edit configurations ,然后进⾏如下操作:(点击左上⾓的"+",然后选择maven将出现右侧⾯板,在红⾊划线部位输⼊如图所⽰指令,你可以为该指令命名(此处命名为MvnSpringBootRun))
点击保存将会在IDEA项⽬运⾏部位出现,点击绿⾊箭头运⾏即可
②. 使⽤spring-boot-devtools
在项⽬的pom⽂件中添加依赖:
<!--热部署jar-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
然后:使⽤ shift+ctrl+alt+"/" (IDEA中的快捷键)选择"Registry" 然后勾compiler.automake.allow.whe
n.app.running
39. 什么是 spring cloud?
从字⾯理解,Spring Cloud 就是致⼒于分布式系统、云服务的框架。
Spring Cloud 是整个 Spring 家族中新的成员,是最近云服务⽕爆的必然产物。
Spring Cloud 为开发⼈员提供了快速构建分布式系统中⼀些常见模式的⼯具,例如:
配置管理
服务注册与发现
断路器
智能路由
服务间调⽤
负载均衡
微代理
控制总线
⼀次性令牌
全局锁
领导选举
分布式会话
集状态
分布式消息
……
使⽤ Spring Cloud 开发⼈员可以开箱即⽤的实现这些模式的服务和应⽤程序。这些服务可以任何环境下运⾏,包括分布式环境,也包括开发⼈员⾃⼰的笔记本电脑以及各种托管平台。
40. spring cloud 的核⼼组件有哪些?
①. 服务发现——Netflix Eureka
⼀个RESTful服务,⽤来定位运⾏在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器⽤作服务注册服务器。Eureka客户端是⼀个java客户端,⽤来简化与服务器的交互、作为轮询负载均衡器,并②. 客服端负载均衡——Netflix Ribbon
Ribbon,主要提供客户侧的软件负载均衡算法。Ribbon客户端组件提供⼀系列完善的配置选项,⽐如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。
③. 断路器——Netflix Hystrix
断路器可以防⽌⼀个应⽤程序多次试图执⾏⼀个操作,即很可能失败,允许它继续⽽不等待故障恢复或者浪费 CPU 周期,⽽它确定该故障是持久的。断路器模式也使应⽤程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应⽤程序可以尝④. 服务⽹关——Netflix Zuul
类似nginx,反向代理的功能,不过netflix⾃⼰增加了⼀些配合其他组件的特性。
⑤. 分布式配置——Spring Cloud Config
这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新。

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