现在关于Java面试的资料是层出不穷,对于选择困难症的同学来说,无疑是陷入了一次次的抉择与不安中,担心错过了关键内容,现在小曾哥秉持着"融百家之所长,汇精辟之文档"的思想,整理一下目前主流的一些八股文,以达到1+1 > 2 的效果!
文章目录
-
- 1、Spring
-
- 1.1、什么是 Spring 框架?
- 1.2、对Spring IOC的了解
- 1.3、对Spring 容器的了解
- 1.4、什么是Spring Bean?
- 1.5、注入 Bean 的注解有哪些?
-
- 1.5.1、@Autowired 和 @Resource 的区别是什么?
- 1.6、Bean的作用域
- 1.7、Bean的生命周期
- 1.8、对Spring AOP的理解
- 1.9、Spring如何管理事务?
- 1.10、Spring 框架中用到了了哪些设计模式?
- 2、SpringMVC
-
- 2.1、什么是MVC?
- 2.2、Spring MVC的核心组件有哪些?
- 2.3、Spring MVC的工作原理?
- 2.4、Spring MVC常用的注解有哪些?
- 2.5、介绍一下Spring MVC的拦截器
- 3、MyBatis
-
- 3.1、谈谈你对 MyBatis 的理解?
- 3.2、Mybatis的优缺点有哪些?
- 3.3、MyBatis中的$和#有什么区别?
- 3.4、MyBatis 是如何进行行分页的?分页插件的原理理是什么?
- 3.5、MyBatis 逻辑分页和物理理分页的区别是什么?
- 3.6、MyBatis缓存机制
- 4、Spring Boot
-
- 4.1、谈谈对Spring Boot的理解
- 4.2、Spring Boot Starter有什么用?
- 4.3、介绍Spring Boot的启动流程
- 4.4、Spring Boot 的核心注解?
- 4.5、SpringBoot 自动配置
-
- 4.5.1、自动配置过程
- 4.5.2、自动配置原理
- 4.6、SpringBoot、Spring MVC和Spring有什什么区别?
- 4.7、什么是YAML? 优势在哪?
- 5、其他内容
-
- 5.1、cookie和session的区别是什么?
- 5.2、Cookie和Session各自适合的场景是什么?
- 5.3、Session的工作原理
- 5.4、Get请求与Post请求有什么区别?
1、Spring
1.1、什么是 Spring 框架?
介绍:Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。
两个核心部分:IOC 和 Aop
(1)IOC:控制反转,把创建对象过程交给 Spring 进行管理
(2)Aop:面向切面,不修改源代码进行功能增强
Spring 特点
(1)方便解耦,简化开发
(2)Aop 编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低 API 开发难度
模块组成
Spring框架包含众多模块,如Core、Testing、Data Access、Web Servlet等,其中Core是整个Spring框架的核心模块。
Spring 各个模块的依赖关系
Core Container
Spring 框架的核心模块,也可以说是基础模块,主要提供 IoC 依赖注入功能的支持。Spring 其他所有的功能基本都需要依赖于该模块,我们从上面那张 Spring 各个模块的依赖关系图就可以看出来。
- spring-core :Spring 框架基本的核心工具类。
- spring-beans :提供对 bean的创建、配置和管理等功能的支持。
- spring-context :提供对国际化、事件传播、资源加载等功能的支持。
- spring-expression :提供对表达式语言(Spring Expression Language) SpEL 的支持,只依赖于core 模块,不依赖于其他模块,可以单独使用。
AOP
- spring-aspects :该模块为与 AspectJ 的集成提供支持。 spring-aop :提供了面向切面的编程实现。
- spring-instrument :提供了为 JVM 添加代理(agent)的功能。 具体来讲,它为 Tomcat提供了一个织入代理,能够为 Tomcat 传递类文 件,就像这些文件是被类加载器加载的一样。没有理解也没关系,这个模块的使用场景非常有限。
Data Access/Integration
- spring-jdbc :提供了对数据库访问的抽象 JDBC。不同的数据库都有自己独立的 API 用于操作数据库,而 Java程序只需要和 JDBC API 交互,这样就屏蔽了数据库的影响。
- spring-tx :提供对事务的支持。
- spring-orm :提供对 Hibernate、JPA 、iBatis 等 ORM 框架的支持。
- spring-oxm :提供一个抽象层支撑OXM(Object-to-XML-Mapping),例如:JAXB、Castor、XMLBeans、JiBX 和 XStream 等。
- spring-jms : 消息服务。自 Spring Framework 4.1 以后,它还提供了对 spring-messaging模块的继承。
Spring Web
- spring-web :对 Web 功能的实现提供一些最基础的支持。
- spring-webmvc : 提供对 Spring MVC的实现。
- spring-websocket : 提供了对 WebSocket 的支持,WebSocket可以让客户端和服务端进行双向通信。
- spring-webflux :提供对 WebFlux 的支持。WebFlux 是 SpringFramework 5.0 中引入的新的响应式框架。与 Spring MVC 不同,它不需要 Servlet API,是完全异步。
Messaging - spring-messaging 是从 Spring4.0 开始新加入的一个模块,主要职责是为 Spring
框架集成一些基础的报文传送应用。
#Spring Test
Spring 团队提倡测试驱动开发(TDD)。有了控制反转 (IoC)的帮助,单元测试和集成测试变得更简单。
Spring 的测试模块对 JUnit(单元测试框架)、TestNG(类似 JUnit)、Mockito(主要用来 Mock 对象)、PowerMock(解决 Mockito 的问题比如无法模拟 final, static, private 方法)等等常用的测试框架支持的都比较好。
上述各个模块可以作为知识点查询内容,当那个板块不太熟悉时,可以进行查询了解,最重要的还是Core模块,其他了解即可。
1.2、对Spring IOC的了解
概念:IoC(Inversion of Control)是控制反转的意思,这是一种面向对象编程的设计思想,把对象创建和对象之间的调用过程,交给 Spring 进行管理。
目的:它可以帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。
将对象之间的相互依赖关系交给 IoC 容器(上图的UserFactory)来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
1.3、对Spring 容器的了解
主要提供了两种类型的容器:BeanFactory和ApplicationContext
- BeanFactory:是类的通用工厂,它可以创建并管理各种类的对象,是基础类型的IoC容器,提供完整的IoC服务支持;默认采用延迟初始化策略,只有当客户端对象需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作。
- ApplicationContext:它是在BeanFactory的基础上构建的,是相对比较高级的容器实现,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他高级特性,比如事件发布、国际化信息支持等;ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。
1.4、什么是Spring Bean?
Bean 代指的就是那些被 IoC 容器所管理的对象。
我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。
<!-- Constructor-arg with 'value' attribute -->
<bean id="..." class="...">
<constructor-arg value="..."/>
</bean>
管理Bean时常用的一些注解:
- @ComponentScan用于声明扫描策略,通过它的声明,容器就知道要扫描哪些包下带有声明的类,也可以知道哪些特定的类是被排除在外的。
- @Component、@Repository、@Service、@Controller用于声明Bean,它们的作用一样,但是语义不同。@Component用于声明通用的Bean,@Repository用于声明DAO层的Bean,@Service用于声明业务层的Bean,@Controller用于声明视图层的控制器Bean,被这些注解声明的类就可以被容器扫描并创建。
- @Autowired、@Qualifier用于注入Bean,即告诉容器应该为当前属性注入哪个Bean。其中,@Autowired是按照Bean的类型进行匹配的,如果这个属性的类型具有多个Bean,就可以通过@Qualifier指定Bean的名称,以消除歧义。
- @Scope用于声明Bean的作用域,默认情况下Bean是单例的,即在整个容器中这个类型只有一个实例。可以通过@Scope注解指定prototype值将其声明为多例的,也可以将Bean声明为session级作用域、request级作用域等等,但最常用的还是默认的单例模式。
- @PostConstruct、@PreDestroy用于声明Bean的生命周期。其中,被@PostConstruct修饰的方法将在Bean实例化后被调用,@PreDestroy修饰的方法将在容器销毁前被调用。
1.5、注入 Bean 的注解有哪些?
Spring 内置的 @Autowired 以及 JDK 内置的 @Resource 和 @Inject 都可以用于注入 Bean。
1.5.1、@Autowired 和 @Resource 的区别是什么?
- @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
- Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。
- 当一个接口存在多个实现类的情况下,@Autowired 和@Resource都需要通过名称才能正确匹配到对应的Bean。Autowired 可以通过 @Qualifier 注解来显示指定名称,@Resource可以通过 name 属性来显示指定名称。
1.6、Bean的作用域
默认情况下,Bean在Spring容器中是单例的,我们可以通过@Scope注解修改Bean的作用域。该注解有如下5个取值,它们代表了Bean的5种不同类型的作用域:
1.7、Bean的生命周期
Spring容器管理Bean,涉及对Bean的创建、初始化、调用、销毁等一系列的流程,这个流程就是Bean的生命周期。
1.8、对Spring AOP的理解
AOP(Aspect Oriented Programming)是面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。
- 连接点(join point):对应的是具体被拦截的对象,因为Spring只能支持方法,所以被拦截的对象往往就是指特定的方法,AOP将通过动态代理技术把它织入对应的流程中。
- 切点(point cut):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点。切点就是提供这样一个功能的概念。
- 通知(advice):就是按照约定的流程下的方法,分为前置通知、后置通知、环绕通知、事后返回通知和异常通知,它会根据约定织入流程中。
- 目标对象(target):即被代理对象。
- 引入(introduction):是指引入新的类和其方法,增强现有Bean的功能。
- 织入(weaving):它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。
- 切面(aspect):是一个可以定义切点、各类通知和引入的内容,SpringAOP将通过它的信息来增强Bean的功能或者将对应的方法织入流程。
AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式 - JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。
- CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。
应用场景:应用可以直接使用AOP的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活地编制到模块中,比如可以通过AOP实现应用程序中的日志功能;在Spring内部,一些支持模块也是通过Spring AOP来实现的,比如事务处理。从这两个角度就已经可以看到Spring AOP的核心地位了。
1.9、Spring如何管理事务?
Spring为事务管理提供了一致的编程模板,在高层次上建立了统一的事务抽象。
Spring支持两种事务编程模型:
- 编程式事务
Spring提供了TransactionTemplate模板,利用该模板我们可以通过编程的方式实现事务管理,而无需关注资源获取、复用、释放、事务同步及异常处理等操作。相对于声明式事务来说,这种方式相对麻烦一些,但是好在更为灵活,我们可以将事务管理的范围控制的更为精确。 - 声明式事务
Spring事务管理的亮点在于声明式事务管理,它允许我们通过声明的方式,在IoC配置中指定事务的边界和事务属性,Spring会自动在指定的事务边界上应用事务属性。相对于编程式事务来说,这种方式十分的方便,只需要在需要做事务管理的方法上,增加@Transactional注解,以声明事务特征即可。
1.10、Spring 框架中用到了了哪些设计模式?
- 工厂设计模式: Spring使用工厂模式通过BeanFactory、 ApplicationContext创建bean对象;
- 代理设计模式: Spring AOP功能的实现;
- 单例设计模式: Spring中的Bean默认都是单例的;
- 模板方法模式: Spring中jdbcTemplate、hibernateTemplate 等以Template结尾的对数据库操作的类,它们就使用到了模板模式;
- 包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源;
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用;
- 适配器模式: Spring AOP的增强或通知(Advice)使用到了适配器模式、SpringMVC 中也是用到了适配器模式适配Controller。
2、SpringMVC
2.1、什么是MVC?
MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。
2.2、Spring MVC的核心组件有哪些?
知道组件的功能,那么距离SpringMVC的工作原理也就不远了
-
前端控制器DispatcherServlet
作用: SpringMVC的入口函数。接收请求,响应结果,相当于转发器,中央处理器。用户请求到达前端控制器,它就相当于MVC模式中的C, DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。 -
处理器映射器HandlerMapping
作用: 根据 uri 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。 -
处理器适配器HandlerAdapter
作用:根据 HandlerMapping 找到的 Handler,适配执行对应的 Handler。通过HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。 -
请求处理器Handler
处理实际请求的处理器 -
视图解析器View resolver
作用: 根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端。 -
视图 View
View是一个接口, 实现类支持不同的View类型(jsp、 freemarker…). 。
2.3、Spring MVC的工作原理?
Guide哥的这块内容,是思路清晰明了的,因此为了方便大家理解,直接就按照Guide哥的内容进行整理。
https://javaguide.cn/system-design/framework/spring/spring-knowledge-and-questions-summary.html
精简速记版:客户端(浏览器)发送请求->前端控制器DispatcherServlet接受客户端请求->找到处理器映射HandlerMapping解析请求对应的Handler -> HandlerAdapter会根据Handler来调用真正的处理器来处理请求,并处理相应的业务逻辑->处理器返回一个模型视图ModelAndView ->视图解析器进行解析->返回一个视图对象->前端控制器DispatcherServlet渲染数据(Model) >将得到视图对象返回给用户。
具体流程如下:
- 客户端(浏览器)发送请求, DispatcherServlet拦截请求。
- DispatcherServlet 根据请求信息调用HandlerMapping 。HandlerMapping 根据 uri 去匹配查找能处理的 Handler(也就是我们平常说的Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。
- DispatcherServlet 调用 HandlerAdapter适配执行 Handler 。
- Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象到DispatcherServlet,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
- ViewResolver 会根据逻辑 View 查找实际的 View。
- DispaterServlet 把返回的 Model 传给 View(视图渲染)。
- 把 View 返回给请求者(浏览器)
2.4、Spring MVC常用的注解有哪些?
- @RequestMapping:
作用:该注解的作用就是用来处理请求地址映射的,也就是说将其中的处理器方法映射到url路径上。 - @RequestParam:
作用:是将请求参数绑定到你的控制器的方法参数上,是Spring MVC中的接收普通参数的注解。 - @RequestBody:
作用:如果作用在方法上,就表示该方法的返回结果是直接按写入的Http responsebody中。 - @PathVaribale:
作用:该注解是用于绑定url中的占位符,但是注意,spring3.0以后,url才开始支持占位符的,它是SpringMVC支持的rest风格url的一个重要的标志。
2.5、介绍一下Spring MVC的拦截器
拦截器会对处理器进行拦截,这样通过拦截器就可以增强处理器的功能。Spring MVC中,所有的拦截器都需要实现HandlerInterceptor接口,该接口包含如下三个方法:preHandle()、postHandle()、afterCompletion()。
Spring MVC拦截器的执行流程如下:
- 执行preHandle方法,它会返回一个布尔值。如果为false,则结束所有流程,如果为true,则执行下一步。
- 执行处理器逻辑,它包含控制器的功能。
- 执行postHandle方法。
- 执行视图解析和视图渲染。
- 执行afterCompletion方法。
Spring MVC拦截器的开发步骤:
- 开发拦截器:
实现handlerInterceptor接口,从三个方法中选择合适的方法,实现拦截时要执行的具体业务逻辑。 - 注册拦截器:
定义配置类,并让它实现WebMvcConfigurer接口,在接口的addInterceptors方法中,注册拦截器,并定义该拦截器匹配哪些请求路径。
3、MyBatis
3.1、谈谈你对 MyBatis 的理解?
JPA(默认采用Hibernate实现)是全自动的ORM框架,提供对象与数据库的映射。
- Mybatis是一个半ORM (对象关系映射)框架,它内部封装了JDBC, 开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建Statement等繁杂的过程。程序员直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高。
- MyBatis 可以使用XML或注解来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
- 通过XML文件或注解的方式将要执行的各种Statement配置起来,并通过Java对象和Statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由MyBatis 框架执行SQL并将结果映射为Java对象并返回。(从执行 SQL到返回Result 的过程)。
3.2、Mybatis的优缺点有哪些?
优点:
- 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除SQL与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用;
- 与JDBC相比,减少了代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
- 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持) ;
- 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点:
- SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一-定要求;
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
3.3、MyBatis中的$和#有什么区别?
#{} 是预编译处理,${} 是字符串替换
- 使用#设置参数时,MyBatis会创建预编译的SQL语句,然后在执行SQL时MyBatis会为预编译SQL中的占位符(?)赋值。预编译的SQL语句执行效率高,并且可以防止注入攻击。
- 使用$设置参数时,MyBatis只是创建普通的SQL语句,然后在执行SQL语句时MyBatis将参数直接拼入到SQL里。
既然
不安全,为什么还需要
不安全,为什么还需要
不安全,为什么还需要,什么时候会用到它?
可以解决一些特殊情况下的问题。例如,在一些动态表格(根据不同的条件产生不同的动态列)中,我们要传递SQL的列名,根据某些列进行排序,或者传递列名给SQL都是比较常见的场景,这就无法使用预编译的方式了。
3.4、MyBatis 是如何进行行分页的?分页插件的原理理是什么?
(1) MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页;
(2) 可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能
(3) 也可以使用分页插件来完成物理分页
分页插件的基本原理:是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。
举例:
select _ from student ,
拦截 sql 后重写为:
select t._ from (select \* from student)t limit 0,10
3.5、MyBatis 逻辑分页和物理理分页的区别是什么?
1.物理分页速度上并不一定快于逻辑分页,逻辑分页速度上也并不一定快于物理分页。
2.物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加到应用端来,就算速度上存在优势,然而其它性能上的优点足以弥补这个缺点。
3.6、MyBatis缓存机制
MyBatis的缓存分为一级缓存和二级缓存。
- 一级缓存: 一级缓存也叫本地缓存,它默认会启用,并且不能关闭。一级缓存存在于SqlSession 的生命周期中,即它是SqlSession级别的缓存。在同一个 SqlSession 中查询时,MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中。如果同一个SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map 缓存对象中己经存在该键值时,则会返回缓存中的对象。
- 二级缓存:与一级缓存其机制相同,默认也是采用PerpetualCache, HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置;
4、Spring Boot
4.1、谈谈对Spring Boot的理解
Spring Boot使用“习惯优于配置”的理念让你的项目快速地运行起来,使用Spring Boot很容易创建一个能独立运行、准生产级别、基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。
Spring Boot本身并不提供Spring的核心功能,而是作为Spring的脚手架框架,以达到快速构建项目、预置三方配置、开箱即用的目的。
优点:
- 可以快速构建项目;
- 可以对主流开发框架的无配置集成,简化配置、自动配置;
- 项目可独立运行,无需外部依赖Servlet容器;
- 提供运行时的应用监控;
- 可以极大地提高开发、部署效率;
- 可以与云计算天然集成。
4.2、Spring Boot Starter有什么用?
Spring Boot通过提供众多起步依赖(Starter)降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model, POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。很多起步依赖的命名都暗示了它们提供的某种或某类功能。
4.3、介绍Spring Boot的启动流程
Spring Boot项目创建完成会默认生成一个名为 *Application 的入口类,我们是通过该类的main方法启动Spring Boot项目的。在main方法中,通过SpringApplication的静态方法,即run方法进行SpringApplication类的实例化操作,然后再针对实例化对象调用另外一个run方法来完成整个项目的初始化和启动。
SpringApplication调用的run方法的大致流程,如下图
主要操作:获取监听器和参数配置、打印Banner信息、创建并初始化容器、监听器发送通知
4.4、Spring Boot 的核心注解?
- @SpringBootConfiguration: 组合了@Configuration注解,实现配置文件的功能
- @EnableAutoConfiguration: 打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})。
- @ComponentScan: Spring组件扫描。
- @Conditional注解,不同之处是它们在注解中指定的条件(Condition)不同
4.5、SpringBoot 自动配置
4.5.1、自动配置过程
Spring Boot实现该运作机制锁涉及的核心部分如下图所示:
- Spring Boot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中注册的各种AutoConfiguration类
- 当某个AutoConfiguration类满足其注解@Conditional指定的生效条件(Starters提供的依赖、配置或Spring容器中是否存在某个Bean等)时,实例化该AutoConfiguration类中定义的Bean(组件等),并注入Spring容器,就可以完成依赖框架的自动配置。
4.5.2、自动配置原理
- SpringBoot启动会加载大量的自动配置类
- 我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
- 我们再来看这个自动配置类中到底配置了哪些组件; (只要我们要 用的组件存在在其中,我们就不需要再手动配置了)
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可; xxxAutoConfigurartion: 自动配置类;给容器中添加组件
4.6、SpringBoot、Spring MVC和Spring有什什么区别?
- Spring Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转。当我们恰当的使用DI或者是IOC的时候,可以开发松耦合应用
- Spring MVC SpringMVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet,MoudIAndView和ViewResolver等一些简单的概念,开发Web应用将会变的非常简单。
- SpringBoot Spring和Spring MVC的问题在于需要配置大量的参数。SpringBoot通过一个自动配置和启动的项来解决这个问题。
4.7、什么是YAML? 优势在哪?
概念:YAML是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。
优势:
- 1.配置有序,在一些特殊的场景下,配置有序很关键
- 2.支持数组,数组中的元素可以是基本数据类型也可以是对象
- 3.简洁
缺点:相比properties配置文件,不支持@PropertySource注解导入自定义的YAML配置。
5、其他内容
5.1、cookie和session的区别是什么?
- 存储位置不同:cookie存放于客户端;session存放于服务端。
- 存储容量不同:单个cookie保存的数据<=4KB,一个站点最多保存20个cookie;而session并没有上限。
- 存储方式不同:cookie只能保存ASCII字符串,并需要通过编码当时存储为Unicode字符或者二进制数据;session中能够存储任何类型的数据,例如字符串、整数、集合等。
- 隐私策略不同:cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的;session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
- 生命周期不同:可以通过设置cookie的属性,达到cookie长期有效的效果;session依赖于名为JSESSIONID的cookie,而该cookie的默认过期时间为-1,只需关闭窗口该session就会失效,因此session不能长期有效。
- 服务器压力不同:cookie保存在客户端,不占用服务器资源;session保管在服务器上,每个用户都会产生一个session,如果并发量大的话,则会消耗大量的服务器内存。
- 浏览器支持不同:cookie是需要浏览器支持的,如果客户端禁用了cookie,则会话跟踪就会失效;运用session就需要使用URL重写的方式,所有用到session的URL都要进行重写,否则session会话跟踪也会失效。
- 跨域支持不同:cookie支持跨域访问,session不支持跨域访问。
5.2、Cookie和Session各自适合的场景是什么?
- 对于敏感数据,应存放在session里,因为cookie不安全。
- 对于普通数据,优先考虑存放在cookie里,这样会减少对服务器资源的占用。
5.3、Session的工作原理
session依赖于cookie。
- 当客户端首次访问服务器时,服务器会为其创建一个session对象,该对象具有一个唯一标识SESSIONID。并且在响应阶段,服务器会创建一个cookie,并将SESSIONID存入其中。
- 客户端通过响应的cookie而持有SESSIONID,所以当它再次访问服务器时,会通过cookie携带这个SESSIONID。服务器获取到SESSIONID后,就可以找到与之对应的session对象,进而从这个session中获取该客户端的状态。
5.4、Get请求与Post请求有什么区别?
- Get是从服务器上获取数据,Post是向服务器提交数据。
- GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。
- Get传送的数据量较小,不能大于2KB。 Post传送的数据量较大,一般被默认为不受限制。
- Get安全性非常低,Get设计成传输数据,一般都在地址栏里面可以看到,Post安全性较高,Post传递数据比较隐私,所以在地址栏看不到,如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。
- GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,Post请求不具有这些功能。
JavaWeb框架内容还有待完善,但是已经实现了从0到1的过程,后续会根据真实面试情况持续更新相关内容,实现从1到100的飞跃,我会继续更新面试板块内容,还请小伙伴们持续关注!
欢迎各位小伙伴们阅读以下内容,定能收获满满!
参考文档:
- guide哥:https://javaguide.cn/database/mysql/mysql-questions-01.html
- 牛客网:https://www.nowcoder.com/tutorial/94/36e2c89b4b4641f8b3c566758fdc879d
- 帅地玩编程-- Java面试必知必会
- Get、Post 区别:https://blog.csdn.net/qq_32523711/article/details/108956775