Java面试之JavaWeb常用框架(offer 拿来吧你)

2年前 (2022) 程序员胖胖胖虎阿
245 0 0

现在关于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框架的核心模块。
Java面试之JavaWeb常用框架(offer 拿来吧你)
Spring 各个模块的依赖关系
Java面试之JavaWeb常用框架(offer 拿来吧你)
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 进行管理。
目的:它可以帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。
Java面试之JavaWeb常用框架(offer 拿来吧你)

将对象之间的相互依赖关系交给 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。
Java面试之JavaWeb常用框架(offer 拿来吧你)

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种不同类型的作用域:
Java面试之JavaWeb常用框架(offer 拿来吧你)

1.7、Bean的生命周期

Spring容器管理Bean,涉及对Bean的创建、初始化、调用、销毁等一系列的流程,这个流程就是Bean的生命周期。
Java面试之JavaWeb常用框架(offer 拿来吧你)

1.8、对Spring AOP的理解

AOP(Aspect Oriented Programming)是面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。

  • 连接点(join point):对应的是具体被拦截的对象,因为Spring只能支持方法,所以被拦截的对象往往就是指特定的方法,AOP将通过动态代理技术把它织入对应的流程中。
  • 切点(point cut):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点。切点就是提供这样一个功能的概念。
  • 通知(advice):就是按照约定的流程下的方法,分为前置通知、后置通知、环绕通知、事后返回通知和异常通知,它会根据约定织入流程中。
  • 目标对象(target):即被代理对象。
  • 引入(introduction):是指引入新的类和其方法,增强现有Bean的功能。
  • 织入(weaving):它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。
  • 切面(aspect):是一个可以定义切点、各类通知和引入的内容,SpringAOP将通过它的信息来增强Bean的功能或者将对应的方法织入流程。
    Java面试之JavaWeb常用框架(offer 拿来吧你)
    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 框架中用到了了哪些设计模式?

  1. 工厂设计模式: Spring使用工厂模式通过BeanFactory、 ApplicationContext创建bean对象;
  2. 代理设计模式: Spring AOP功能的实现;
  3. 单例设计模式: Spring中的Bean默认都是单例的;
  4. 模板方法模式: Spring中jdbcTemplate、hibernateTemplate 等以Template结尾的对数据库操作的类,它们就使用到了模板模式;
  5. 包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源;
  6. 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用;
  7. 适配器模式: Spring AOP的增强或通知(Advice)使用到了适配器模式、SpringMVC 中也是用到了适配器模式适配Controller。

2、SpringMVC

2.1、什么是MVC?

MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。
Java面试之JavaWeb常用框架(offer 拿来吧你)

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

Java面试之JavaWeb常用框架(offer 拿来吧你)
精简速记版:客户端(浏览器)发送请求->前端控制器DispatcherServlet接受客户端请求->找到处理器映射HandlerMapping解析请求对应的Handler -> HandlerAdapter会根据Handler来调用真正的处理器来处理请求,并处理相应的业务逻辑->处理器返回一个模型视图ModelAndView ->视图解析器进行解析->返回一个视图对象->前端控制器DispatcherServlet渲染数据(Model) >将得到视图对象返回给用户。

具体流程如下:

  1. 客户端(浏览器)发送请求, DispatcherServlet拦截请求。
  2. DispatcherServlet 根据请求信息调用HandlerMapping 。HandlerMapping 根据 uri 去匹配查找能处理的 Handler(也就是我们平常说的Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。
  3. DispatcherServlet 调用 HandlerAdapter适配执行 Handler 。
  4. Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象到DispatcherServlet,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
  5. ViewResolver 会根据逻辑 View 查找实际的 View。
  6. DispaterServlet 把返回的 Model 传给 View(视图渲染)。
  7. 把 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()。
Java面试之JavaWeb常用框架(offer 拿来吧你)
Spring MVC拦截器的执行流程如下:

  • 执行preHandle方法,它会返回一个布尔值。如果为false,则结束所有流程,如果为true,则执行下一步。
  • 执行处理器逻辑,它包含控制器的功能。
  • 执行postHandle方法。
  • 执行视图解析和视图渲染。
  • 执行afterCompletion方法。

Spring MVC拦截器的开发步骤:

  1. 开发拦截器:
    实现handlerInterceptor接口,从三个方法中选择合适的方法,实现拦截时要执行的具体业务逻辑。
  2. 注册拦截器:
    定义配置类,并让它实现WebMvcConfigurer接口,在接口的addInterceptors方法中,注册拦截器,并定义该拦截器匹配哪些请求路径。

3、MyBatis

3.1、谈谈你对 MyBatis 的理解?

JPA(默认采用Hibernate实现)是全自动的ORM框架,提供对象与数据库的映射。

  1. Mybatis是一个半ORM (对象关系映射)框架,它内部封装了JDBC, 开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建Statement等繁杂的过程。程序员直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高。
  2. MyBatis 可以使用XML或注解来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
  3. 通过XML文件或注解的方式将要执行的各种Statement配置起来,并通过Java对象和Statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由MyBatis 框架执行SQL并将结果映射为Java对象并返回。(从执行 SQL到返回Result 的过程)。

3.2、Mybatis的优缺点有哪些?

优点:

  1. 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除SQL与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用;
  2. 与JDBC相比,减少了代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
  3. 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持) ;
  4. 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

缺点:

  1. SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一-定要求;
  2. 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的缓存分为一级缓存和二级缓存。

  1. 一级缓存: 一级缓存也叫本地缓存,它默认会启用,并且不能关闭。一级缓存存在于SqlSession 的生命周期中,即它是SqlSession级别的缓存。在同一个 SqlSession 中查询时,MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中。如果同一个SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map 缓存对象中己经存在该键值时,则会返回缓存中的对象。
  2. 二级缓存:与一级缓存其机制相同,默认也是采用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方法的大致流程,如下图
Java面试之JavaWeb常用框架(offer 拿来吧你)

主要操作:获取监听器和参数配置、打印Banner信息、创建并初始化容器、监听器发送通知

4.4、Spring Boot 的核心注解?

  • @SpringBootConfiguration: 组合了@Configuration注解,实现配置文件的功能
  • @EnableAutoConfiguration: 打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})。
  • @ComponentScan: Spring组件扫描。
  • @Conditional注解,不同之处是它们在注解中指定的条件(Condition)不同

4.5、SpringBoot 自动配置

4.5.1、自动配置过程

Spring Boot实现该运作机制锁涉及的核心部分如下图所示:
Java面试之JavaWeb常用框架(offer 拿来吧你)

  1. Spring Boot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中注册的各种AutoConfiguration类
  2. 当某个AutoConfiguration类满足其注解@Conditional指定的生效条件(Starters提供的依赖、配置或Spring容器中是否存在某个Bean等)时,实例化该AutoConfiguration类中定义的Bean(组件等),并注入Spring容器,就可以完成依赖框架的自动配置。

4.5.2、自动配置原理

  1. SpringBoot启动会加载大量的自动配置类
  2. 我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
  3. 我们再来看这个自动配置类中到底配置了哪些组件; (只要我们要 用的组件存在在其中,我们就不需要再手动配置了)
  4. 给容器中自动配置类添加组件的时候,会从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
版权声明:程序员胖胖胖虎阿 发表于 2022年11月2日 上午2:48。
转载请注明:Java面试之JavaWeb常用框架(offer 拿来吧你) | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...