Java面试准备之SpringBoot

hresh 548 0

Java面试准备之SpringBoot

什么是 Spring Boot?

首先,重要的是要理解 Spring Boot 并不是一个框架,它是一种创建独立应用程序的更简单方法,只需要很少或没有配置(相比于 Spring 来说)。Spring Boot 最好的特性之一是它利用现有的 Spring 项目和第三方项目来开发适合生产的应用程序。

@SpringBootApplication

@SpringBootApplication 注解等价于默认属性使用@Configuration@EnableAutoConfiguration@ComponentScan

  • @Configuration

    允许在 Spring 上下文中注册额外的 bean 或导入其他配置类

  • @EnableAutoConfiguration

启用 SpringBoot 的自动配置机制,具体操作为:

从 classpath 中搜寻所有 META/spring.factories 配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的配置项,也就是一个自动配置类列表加载到 Ioc 容器中。 简单说,就是@EnawebleAutoConfiguration 让 Spring Boot 根据类路径下的 jar 包依赖为当前项目进行自动配置,例如,添加了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖。而对于所有标注@Configuration 的配置类,统一使用ConfigurationClassParser解析的。

通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖。

  • @ComponentScan

    扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。

Interceptor 拦截器

介绍

拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。

在 SpringMVC 中,DispatcherServlet 捕获每个请求,在到达对应的 Controller 之前,请求可以被拦截器(0或多个)处理,在拦截器中进行前置处理后,请求最终才到达 Controller。

应用场景

  1. 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等;
  2. 权限检查:如登录检测,进入处理器检测是否登录;
  3. 性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
  4. 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。

Spring Boot拦截器(Interceptor)详解

Filter过滤器

过滤器 Filter,是在 Servlet 规范中定义的,是 Servlet 容器支持的,该接口定义在 javax.servlet包下,主要是对客户端请求(ServletRequest)进行预处理,以及对服务器响应(ServletResponse)进行后处理。

过滤器和拦截器的区别

Java面试准备之SpringBoot

网上总结区别点如下:

  • 拦截器是基于 Java的反射机制的,而过滤器是基于函数回调。

  • 拦截器不依赖于servlet容器,过滤器依赖于servlet容器。

  • 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

  • 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

  • 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

  • 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑

  • 过滤器和拦截器触发时间和地点不一样:

    过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

    如下图所示:

    Java面试准备之SpringBoot

    过滤器的触发时机是容器后,servlet 之前,所以过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)的入参是 ServletRequest ,而不是httpservletrequest。因为过滤器是在 httpservlet 之前。

    SpringMVC 的机制是由同一个 Servlet 来分发请求给不同的 Controller,其实这一步是在 Servlet 的 service()方法中执行的。

推荐阅读:拦截器和过滤器的区别

springboot系列文章之过滤器 vs 拦截器

SpringBoot配置文件加载顺序

外部加载配置文件的方式十分多,我们选择最常用的即可,在开发的资源文件中进行配置!

SpringBoot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:

优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件

优先级由高到底,高优先级的配置会覆盖低优先级的配置;如下图所示:

Java面试准备之SpringBoot

SpringBoot会从这四个位置全部加载主配置文件;互补配置;

什么是Spring Security ?

Spring Security 是针对 Spring 项目的安全框架,也是 Spring Boot 底层安全模块默认的技术选型,它可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!

Spring Security 的两个主要目标是 “认证” 和 “授权”(访问控制)。

Swagger

Swagger 是一款 RESTFUL 接口的文档在线自动生成+功能测试软件 ,同时也是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。

  • Swagger 可以给属性和接口增加注释信息;
  • 实时更新接口文档;
  • 在线测试。

注意:在正式发布项目时,关闭 Swagger,不仅出于安全考虑,还节省运行内存!

SpringBoot与Spring 的区别

Spring

Spring 作为一款 Java 开发的必选框架,也是一款“胶水”框架,它解决了 Java 企业级开发的复杂度问题,所谓的复杂度问题,就是耦合度问题。

Spring 框架提出了两大核心:IOC 与 AOP。有效的管理了开发中对象的生命周期问题,也提供了与很多框架整合的工具。

但是,Spring 最大的弊端,需要大量的 XML 配置,不管项目整体大小,都需要大量的配置文件搭建架构。

SpringBoot

SpringBoot 可以看作是对 Spring 框架的扩展,可以快速搭建独立的 Spring 应用程序。

它内嵌了 Tomcat,Jetty 等容器,项目是一个 jar 包,通过 Application 入口类快速运行整个项目,提供了 Pom 简化 Maven 的配置,避免了项目包与包的冲突,对第三方技术做了很好的封装。

我认为最重要的一点是,减少了大量的 XML 配置。SpringBoot 基于约定优于配置的理念,原先大量的配置都可以省去,并且不推荐 XML 配置,改为 Java 配置。主要的配置可以写在 apaplication.properties 文件中。

Spring Boot 配置文件的加载顺序是 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

Spring 是怎样引导配置的呢?

Spring支持传统的web.xml引导方式以及最新的Servlet 3+方法。

让我们看一下 web.xml方法的步骤:

  • Servlet容器(服务器)读取web.xml
  • web.xml中定义的DispatcherServlet由容器实例化
  • DispatcherServlet通过读取WEB-INF / {servletName} -servlet.xml来创建WebApplicationContext
  • 最后,DispatcherServlet注册在应用程序上下文中定义的bean

SpringBoot 又是如何配置的呢?

Spring Boot应用程序的入口点是使用@SpringBootApplication注释的类

默认情况下,Spring Boot使用嵌入式容器来运行应用程序。在这种情况下,Spring Boot使用public static void main入口点来启动嵌入式Web服务器。此外,它还负责将Servlet,Filter和ServletContextInitializer bean从应用程序上下文绑定到嵌入式servlet容器。

Spring Boot的另一个特性是它会自动扫描同一个包中的所有类或Main类的子包中的组件。

参考文献

Spring 与 SpringBoot 的区别

Spring,Spring MVC及Spring Boot区别

Spring和SpringBoot比较,解惑区别

SpringBoot2如何替换为Jetty容器(默认Tomcat)

架构比较

Jetty的架构比Tomcat的更为简单

  • Jetty的架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现,扩展简单。
  • Tomcat的架构是基于容器设计的,进行扩展是需要了解Tomcat的整体设计结构,不易扩展。

性能比较

Jetty和Tomcat性能方面差异不大

  • Jetty可以同时处理大量连接而且可以长时间保持连接,适合于web聊天应用等等。
  • Jetty的架构简单,因此作为服务器,Jetty可以按需加载组件,减少不需要的组件,减少了服务器内存开销,从而提高服务器性能。
  • Jetty默认采用NIO(非阻塞IO)结束在处理I/O请求上更占优势,在处理静态资源时,性能较高。
  • Tomcat适合处理少数非常繁忙的链接,也就是说链接生命周期短的话,Tomcat的总体性能更高。 另外,Tomcat默认采用BIO(阻塞IO)处理I/O请求,在处理静态资源时,性能较差。

关于配置修改

1、首先是 maven 配置修改,maven的pom.xml只需要排除tomcat(在 starter-web 依赖中排除),并引入jetty即可

2、配置文件 yml 文件或 properties 文件中增加 acceptors 参数,默认为 2个,selectors 默认为 4个。

参考文献

SpringBoot2使用Jetty容器(替换默认Tomcat)

Springboot的三种启动方式

1、IDE 运行Application这个类的main方法

2、在springboot的应用的根目录下运行mvn spring-boot:run

3、使用mvn install 生成jar后运行

RestFull格式要求

在RESTful架构中,每个uri代表一种资源,因此uri设计中不能使用动词,只能使用名词,并且名词中也应该尽量使用复数形式。使用者应该使用相应的http动词 GET、POST、PUT、PATCH、DELETE等操作这些资源即可。

统一返回数据格式

uri设计规范

1) uri末尾不需要出现斜杠/
2) 在uri中使用斜杠/是表达层级关系的。
3) 在uri中可以使用连接符-, 来提升可读性。
比如 http://xxx.com/xx-yy 比 http://xxx.com/xx_yy中的可读性更好。
4) 在uri中不允许出现下划线字符_.
5) 在uri中尽量使用小写字符。
6) 在uri中不允许出现文件扩展名. 比如接口为 /xxx/api, 不要写成 /xxx/api.php 这样的是不合法的。
7) 在uri中使用复数形式。

RESTful规范中的请求应该返回统一的数据格式。对于返回的数据,一般会包含如下字段:

1) code: http响应的状态码。
2) status: 包含文本, 比如:'success'(成功), 'fail'(失败), 'error'(异常) HTTP状态响应码在500-599之间为 'fail'; 在400-499之间为 'error', 其他一般都为 'success'。 对于响应状态码为 1xx, 2xx, 3xx 这样的可以根据实际情况可要可不要。

当status的值为 'fail' 或 'error'时,需要添加 message 字段,用于显示错误信息。

3) data: 当请求成功的时候, 返回的数据信息。 但是当状态值为 'fail' 或 'error' 时,data仅仅包含错误原因或异常信息等。

参考文献:理解 RESTful API 设计规范

发表评论 取消回复
表情 图片 链接 代码

分享