1、JDK JRE JVM的区别:
JDK:是Java开发的工具箱,包含jre,还包含将java文件编译为.class文件的javac工具类,除此之外还包含Java原生的API,包含J2SE(标准版) J2EE(企业版) J2ME(用于移动设备)。
JRE:是Java运行环境、所有的Java程序都要在jre环境下才可以运行;包括jvm。
JVM:虚拟机,Java运行依赖虚拟机,因为虚拟机所以Java才能跨平台。
2、&和&&的区别:
&&具有短路功能,即如果第一个表达式不成立,则不在比较第二个表达式;&不管第一个表达式成立与否,都会运算第二个表达式。
2.1、==和equals()的区别?
==:
可以比较基本类型,也可以比较引用类型。
比较基本类型,比较的是值是否相同。
比较引用类型,比较的是地址值是否相同。
equals:
只能比较引用类型。
默认情况下,比较的是地址值是否相同。
如果想比较内容,请自己重写Object类的equals()方法。
3、八大基本数据类型:
byte short long int double float char boolean
4、String是基本数据类型吗?
String不是基本数据类型,他是被final修饰的类,因此不能被继承,不能被修改。
5、int和Integer有什么区别:
int是原始数据类型,Integer为引用数据类型。
6、String StringBuilder StringBuffer三者的区别:
String是字符串常量,StringBuffer、StringBuilder是字符串变量;
执行速度:StringBuilder>StringBuffer>String
线程是否安全:StringBuffer是线程安全的、StringBuilder是线程不安全的
使用建议:
如果操作少量的数据用String
单线程下操作大量的数据用StringBulider
多线程下操作大量的数据用StringBuffer
7、java面向对象的三大特征:
封装、继承、多肽
8、封装 继承 多肽的概念:
封装:隐藏对象的属性和实现细节,仅提供公共的访问方法
继承:将类中重复的属性和方法提取到一个类中,其他的类无需定义这些属性和方法,只需要继承这个类即可。
多肽:允许不同类的对象对同一消息做出响应。
9、静态代码块,构造代码块,构造方法的执行顺序
首先执行静态代码块,再执行构造代码块,最后执行构造方法。
静态代码块只执行一次,构造代码块和构造方法可执行多次
10、Collection,Collections,List,Set的区别:
List集合和Set集合都继承Collection.Collection是集合的顶级接口。而Collections是集合的工具类。List是有序可重复的集合接口,其实现类有ArrayList,LinkedList,vector。Set是无序不可重复的集合接口,他的实现类有HashSet,LinkedHashSet,TreeSet.
11、ArrayList,LinkedList,Vector的区别:
ArrayList和vector底层是数组实现的,查询快,增删慢。ArrayList效率高,线程不安全。Vector效率低,线程安全。
LinkedList底层是链表结构,查询慢,增删快。
12、HashMap,HashTable的区别:
HashMap效率高,线程不安全,允许键值为空;
HashTable效率低,线程安全,不允许键值为空。
13、Iterater 和 ListIterator 之间有什么区别?
Iterator 用来遍历 Set 和 List 集合,而 ListIterator 只能遍历 List; Iterator 只可以向前遍历,而 LIstIterator 可以双向遍历;
ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
14、数组和集合的区别:
数组特点:大小固定,只能存储相同数据类型的数据
集合特点:大小可动态扩展,可以存储各种类型的数据
数组转集合:Arrays.asList(数组)
集合转数组:集合.toArray();
15、常见数据结构:
栈 队列 数组 链表 树
16、Map接口和Collection接口的区别:
Map是双列的,Collection是单列的
Map的键值唯一,Collection的子接口Set是唯一的
Map的数据结构只针对键有效,Collection针对元素有效
17、运行时异常和编译时异常的区别:
运行时异常:RuntimeException类及其子类在编译过程中不会报错,运行时会报错
编译时异常:编译过程中出错,不解决无法运行
18、异常的处理方式:
try...catch:在方法内直接解决
throws:将异常抛给上级处理,可以抛出多个异常,可能会抛出
throw:抛出一个异常对象,一定会抛出。
19、final finally finalize的区别:
final是Java关键字,修饰符,修饰变量,变量变成常量;修饰方法,方法不能被重写;修饰类,类不能被继承。
finally是java的一种异常处理机制,try-catch-finally语句代码 finally中的代码一定执行
finalize 垃圾回收器方法
20、重载和重写的区别:
重载和重写都是java多肽的体现。重写是父类和子类之间多态性的表现形式,重载是一个类中多肽性的表现形式。重写时方法名,参数,返回值都必须相同。而重载时参数值不同、返回值可以不同,方法名相同。
21、error和exception有什么区别:
error表示系统错误或底层资源错误,比如内存溢出
exception表示程序设计问题,通过修改程序就能解决
22、抽象类和接口的异同:
相同点:1 都不能被实例化,但可以定义抽象类和接口类型的引用
2 都可以包含抽象方法,实现接口和继承抽象类都必须实现他们的抽象方法
不同点:1 接口只能包含抽象方法、静态方法、和默认方法。不能为普通方法提供方法实现。抽象类则可以完全包含普通方法。
2 接口中只能定义静态常量,不能定义普通成员变量。抽象类中既可以定义静态常量,也可以定义普通成员变量。
3 接口不能包含构造器,抽象类则可以包含构造器。这些构造器并不是用来创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
4 一个类最多只能有一个直接父类,包括抽象类。但是一个类可以实现多个接口,通过实现多个接口可以弥补Java单继承的不足
23、数组length属性,String是length()方法。
24、多线程的几种实现方式,同步的几种实现方式
多线程的实现方式有三种:继承Thread类,实现Runnable接口,使用executor框架
25、什么是死锁?
两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。
26、wait()与 sleep()的区别?
sleep()来自 Thread 类,wait()来自 Object 类;
调用 sleep()方法,线程不会释放对象锁。而调用 wait 方法线程会释放对象锁;
sleep()睡眠后不出让系统资源,wait 让其他线程可以占用 CPU;
sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒。而 wait()需要配合 notify()
或者 notifyAll()使用。
27、什么是 ThreadLocal?ThreadLocal 和 Synchonized 的区别?
线程局部变量。是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。
synchronized 是利用锁的机制,使变量或代码块在某一时刻只能被一个线程访问。而 ThreadLocal 为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。
28、阐述静态变量和实例变量的区别:
静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝,静态变量可以实现让多个对象共享内存。实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。
29、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。
30、GC是什么?为什么要有GC?
GC是垃圾回收,垃圾回收可以有效的防止内存泄露,有效的使用内存资源。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
31、访问修饰符public,private,protected,以及不写(默认)时的区别?
32、列出你常见的运行时异常:
NullPointerException
ClassNotFoundException
ArrayIndexOutOfBoundsException
NoSuchMethodError
IndexOutOfBoundsException
NumberFormatException
SQLException
IOException
33、阐述JDBC操作数据库的步骤:
34、手写单例:
//饿汉单例模式 public class Singleton1{ private Singleton1(){} private static final Singleton1 single = new Singleton1(); public static Singleton1 getInstance(){ return single; } } 点击并拖拽以移动 //懒汉单例模式 public class Singleton2{ private Singleton2(){} private static Singleton2 single = null; public synchronized static Singleton2 getInstance(){ if(single == null){ single = new Singleton2(); } return single; } } 点击并拖拽以移动
35、冒泡排序:
36、二分查找:
37、什么是springmvc框架:
springMVC是一个基于mvc的web框架,它是spring框架的一个模块,它和spring之间无需通过中间整合就能进行开发。
38、SpringMVC流程
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的后端控制器Controller。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、 DispatcherServlet根据View进行渲染视图并响应用户。
39、Spring MVC核心组件:
1.DispatcherServlet(中央处理器):将请求转发给控制器
2.Controller(控制器):处理请求的控制器
3.HandlerMapping(映射处理器):负责映射中央处理器转发给Controller时的映射策略
4.ModelAndView:服务器返回数据以及视图层的封装类
5.ViewResolver(视图解析器):解析具体的视图
40、DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:
1. 截获符合特定格式的URL请求。
2. 初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
3. 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
41、Springmvc的优点:
- 可以支持各种视图技术,而不仅仅局限于JSP;
- 与Spring框架集成(如IoC容器、AOP等);
- 清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
- 支持各种请求资源的映射策略。
42、SQL优化
- SQL语句全部大写 (所有SQL语句执行时都会转换成大写)
- 避免使用星号 * ,用具体字段替代(使用星号会在查询时增加一个查询列的操作)
- 尽量避免在 where 子句中对字段进行 null 值判断,最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库 (不然会进行全表扫描,影响效率)
- 应尽量避免在 where 子句中使用 != 或 <> ,in 或 not in 操作符 (同上)
- 能用between就不要使用in,或者用exists替换in
- 尽可能的使用 varchar/nvarchar 代替 char/nchar (节省字段存储空间)
43、转发和重定向的区别:
转发:
客户端只发送一次请求;
地址栏不会改变:
转发能传递数据。
重定向:
客户端发送两次请求;
地址栏改变;
重定向不能传递数据;
可以访问其他应用。
44、get请求与post请求的区别:
get提交将数据加载在地址栏后面,post提交将数据封装在请求体当中;
get提交相对不安全,post提交相对安全;
get提交有大小限制,根据浏览器的不同而不同,post提交没有大小限制。
45、怎么防止表单重复提交?
1.禁掉提交按钮。表单提交后使用 Javascript 使提交按钮 disable。
2.Post/Redirect/Get 模式。在提交后执行页面重定向,这就是所谓的 Post-Redirect-Get (PRG) 模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。
3.在 session 中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在 session 中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从 session 中删除它,然后正常处理数据。
46、jsp9大内置对象:
request:封装客户端的请求,其中包含来自GET或POST请求的参数;
response:封装服务器对客户端的响应;
page:JSP页面本身(相当于Java程序中的this);
pageContext:通过该对象可以获取其他对象;
session:封装用户会话的对象;
application:封装服务器运行环境的对象;
exception:封装页面抛出异常的对象。
out:输出服务器响应的输出流对象;
config:Web应用的配置对象;
47、servlet的生命周期:
实例化:执行构造函数;
初始化:执行init方法;
服务:执行service方法;
销毁:执行destroy方法。
48、对spring的理解:
Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,Spring 主要核心是:
(1)控制反转(IOC):传统的 java 开发模式中,当需要一个对象时,我们会自己创建一个对象,而在 Spring 开发模式中,Spring 容器使用了工厂模式为我们创建了所需要的对象,我们直接调用 Spring 为我们提供的对象即可,这就是控制反转的思想。
(2)依赖注入(DI):Spring 使用 Java对象的 Set 方法或者带参数的构造方法,为我们所需创建的对象的属性自动设置值的过程,就是依赖注入的基本思想。
(3)面向切面编程(AOP):我们将多个对象中与业务无关的公共行为和逻辑抽取并封装到一个模块当中,对这个模块进行一些如权限验证,事物管理,记录日志等公用操作的处理过程就是面向切面编程的思想。这样做减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。
49、spring的优点:
1、使用spring框架,提高了开发效率,不需要自己频繁地重复地操作对象,spring都直接替我们管理了对象。
2、spring对其他技术也提供了很好的接口支持,可以更好地和mybatis、hibernate等技术的融合。
3、spring框架降低了软件的耦合度,方便软件日后的维护和升级。
50、spring的事物:
事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。
开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
51、事务的特性:
原子性:事务是一个不可分割的工作单元,事务中的操作要都发生要么都不发生;
一致性:事务必须使数据库从一个一致性状态转变到另一个一致性状态。转账前和转账后的总金额不变;
隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务不能被其他的事务操作数据所干扰;
多个并发事务之间要相互隔离;
持久性:指一个事务一旦被提交,他对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有所影响。
52、事务的隔离级别:
脏读:指一个事务读取到了另一个事务未提交的数据;
不可重复读:在一个事务内读取表中的某一行数据,多次读取的结果不同。一个事务读取到了另一个事务提交后的数据;(update)
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致(insert)。
53、Spring管理事务有几种方式?
有两种方式:
1、编程式事务,在代码中硬编码。(不推荐使用)
2、声明式事务,在配置文件中配置(推荐使用)
声明式事务又分为两种:
a、基于XML的声明式事务
b、基于注解的声明式事务
54、Spring常见创建对象的注解?
@Component@Controller@ Service@ Repository
55、Spring中用到的设计模式
- 工厂模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
- 代理模式 : Spring AOP 功能的实现。
- 单例模式 : Spring 中的 Bean 默认都是单例的。
- 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
- 装饰者模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
56、spring中的核心类有那些,各有什么作用?
BeanFactory:产生一个新的实例,可以实现单例模式
BeanWrapper:提供统一的get及set方法
ApplicationContext:提供框架的实现,包括BeanFactory的所有功能
57、spring注入的方式有哪些?
1、构造器注入
2、setter方法注入
3、接口注入
58、过滤器和拦截器的区别:
(1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。
(2)拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
(3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
(4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
(5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
59、MyBatis是什么?
MyBatis 是一款优秀的持久层框架,一个半 自动ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
60、ORM是什么
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。
61、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
62、MyBatis编程步骤是什么样的?
- 创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 通过sqlsession执行数据库操作
- 调用session.commit()提交事务
- 调用session.close()关闭会话
63、说说MyBatis的工作原理
- 读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
- 加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
- 构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
- 创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
- Executor 执行器操作数据库:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
- MappedStatement 对象封装映射信息:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
- 输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
- 输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
64、mybatis #{}和${}的区别是什么?
(1)#{}是预编译处理,${}是字符串替换。
(2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
(3)Mybatis在处理${}时,就是把${}替换成变量的值。
(4)使用#{}可以有效的防止SQL注入,提高系统安全性。
65、什么是 Spring Boot?
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件的一站式解决方案,简化了使用 Spring 的难度,减少了繁重的配置,提供了各种启动器,开发者能快速上手。
66、Springboot 有哪些优点?
- 可以快速创建独立运行的spring项目与主流框架集成
- 使用嵌入式的servlet容器,应用无需打包成war包
- starters自动依赖与版本控制
- 大量的自动配置,简化开发
- 拥有准生产环境的应用监控
67、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
68、Spring Boot 自动配置原理是什么?
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,
@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。
筛选有效的自动配置类。每一个自动配置类结合对应的配置文件进行自动配置功能。
69、spring boot 核心配置文件是什么?有何区别 ?
spring boot 的两个核心配置文件:
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。且 boostrap 里面的属性不能被覆盖;
application (. yml 或者 . properties): 由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。
70、你如何理解 Spring Boot 配置加载顺序?
在 Spring Boot 里面,可以使用以下几种方式来加载配置。
- properties文件;
- YAML文件;
- 系统环境变量;
- 命令行参数;
等等……
71、开启 Spring Boot 特性有哪几种方式?
- 继承spring-boot-starter-parent项目
- 导入spring-boot-dependencies项目依赖
72、运行 Spring Boot 有哪几种方式?
- 打包用命令或者放到容器中运行
- 用 Maven/ Gradle 插件运行
- 直接执行 main 方法运行
73、你如何理解 Spring Boot 中的 Starters?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
74、Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架。
75、SpringBoot 实现热部署有哪几种方式?
主要有两种方式:
- Spring Loaded
- Spring-boot-devtools
76、什么是YAML?
YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。
77、Spring、Spring MVC和Spring Boot有什么区别?
1)Spring
Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用,使系统更容易维护。
2)Spring MVC
Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些组件,使 Web 应用开发变的非常简单。
3)SpringBoot
Spring和SpringMVC 的问题在于需要配置大量的参数。Spring Boot 通过一个自动配置和启动的项目来解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征,极大程度的简化了开发。