了解Spring Boot项目架构

了解Spring Boot项目架构


很多人在编程中仅仅是使用Spring Boot写项目,可能不了解其中的原理
或者当自己搭建项目时遇到很多问题
如:

  • 为什么登陆验证用过滤器
  • 为什么权限认证用拦截器
  • 又在哪里写日志,统一返回处理,异常处理
  • 以及事务管理在哪里

等等一系列问题,本文就带大家了解Spring Boot项目是什么样的

前文主要介绍Spring Boot的发展和流程,知道了流程,知道了过滤器、拦截器在哪里,了解了他们的作用以及优缺点,就知道怎么选择,为什么,或许还能解答你困扰你的其他问题。
可以跳过直接看后面的 四、小结与使用


一、服务器架构演变

1.直接使用Servlet

在Java Web应用的早期,开发者直接使用Servlet API来处理HTTP请求和生成响应。Servlet是运行在服务器上的Java小程序,可以响应客户端请求,并返回动态生成的HTML页面或其他数据格式。

2.引入jsp和mvc

JavaServer Pages (JSP) 使得页面设计人员可以更加容易地编写动态网页。JSP允许将Java代码片段嵌入到HTML页面中,解决了Servlet编写HTML代码困难的问题。MVC模式为Web应用提供了一种清晰的分层架构,将业务逻辑(Model),用户界面(View)和控制逻辑(Controller)分离开来,有利于维护和开发。

3.tomcat+JavaServlet架构

Tomcat是一个开源的Servlet容器,它提供了对Servlet和JSP的支持。使用Tomcat可以方便地部署和运行基于Servlet和JSP的Web应用程序。在这个阶段,开发者仍然需要编写大量的Java代码来处理HTTP请求和响应,Tomcat的引入使得部署和运行Web应用程序变得更加容易。
但是存在配置繁琐、单元测试困难、代码复杂性 等问题

4.tomcat+spring架构

随着Spring框架的兴起,越来越多的开发者开始使用Spring来构建Web应用程序。Spring提供了强大的依赖注入面向切面编程功能,使得开发者可以更加专注于业务逻辑的实现。同时,Spring MVC作为Spring框架的一部分,提供了对MVC设计模式的支持,进一步简化了Web开发过程。在这个阶段,开发者可以使用Tomcat作为Servlet容器来部署和运行基于Spring的Web应用程序。
但是仍然存在配置相对复杂需要一定的学习成本;性能可能因复杂的配置而受到影响。等问题

5.SpringBoot

虽然Spring框架已经大大简化了Web开发过程,但Spring Boot的推出进一步加速了开发速度。Spring Boot遵循“约定优于配置”的原则,提供了大量的默认配置自动配置功能,使得开发者无需编写大量的配置文件即可快速构建和运行Web应用程序。此外,Spring Boot还集成了许多常用的第三方库和框架(如数据库连接池、缓存、安全等),使得开发者可以更加便捷地使用这些技术。在这个阶段,开发者可以使用Spring Boot快速构建和部署Web应用程序,无需关心底层的Servlet容器和配置细节。

总结
简化配置SpringBoot简省了繁重的配置,提供了各种启动器,开发者能快速上手。
快速开发通过集成绝大部分目前流行的开发框架,开发者可以快速搭建Spring项目。
约定优于配置SpringBoot的核心设计思想是“约定优于配置”,即遵循一定的规范和约定,可以减少不必要的配置。
提供非功能性特性如嵌入式服务器、安全、指标、健康检测、外部配置等,这些特性在大型项目中非常常见。

二、Spring Boot大致启动流程

  1. 加载启动类
    • 启动类是使用了@SpringBootApplication注解标注的类,该注解包含了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan三个注解的功能。SpringBoot通过扫描启动类所在的包及子包,自动配置相应的Bean
  2. 加载配置文件
    • SpringBoot程序默认从applicaiton.propertiesapplication.yml中加载配置,也可以通过在启动类上标注@PropertySource来引入其他的配置文件
  3. 创建Spring容器
    • SpringBoot使用SpringBootApplication类创建Spring容器,SpringApplication类是SpringBoot的核心类,它提供了配置和管理Bean的方法。如果是Web应用,SpringApplication会创建一个内置的Web服务器
  4. 加载自动配置
    • SpringBoot通过@EnableAutoConfiguration来完成自动配置,根据starter依赖中的Configuration和Bean的装配情况,自动装配相应的Bean
  5. 运行SpringBoot应用程序
    • 当一切准备就绪后,SpringBoot就会启动应用程序,如果是Web应用,就会启动内置的Web服务器,如果使用的是Web服务器,可以将应用程序打包成一个可以直接运行的jar文件

三、Spring Boot请求流程

  1. 请求接收

    • 当客户端(如Web浏览器)发送HTTP请求到服务器时,Tomcat(或其他Servlet容器)的线程会接收这个请求。
  2. 过滤器(Filter)过滤

    • 在请求被DispatcherServlet处理之前,会经过一系列的过滤器链(Filter Chain)。
    • 这些过滤器可以对请求进行预处理,如编码转换、权限检查等。
  3. 请求分发到DispatcherServlet

    • 请求到达DispatcherServlet,作为Spring MVC的中央处理器,它会开始处理请求。
  4. 拦截器(Interceptor)拦截

    • 在请求到达Controller之前,会先经过配置的拦截器链。
    • 拦截器常用于执行一些通用的逻辑,如日志记录、性能监控、权限验证等。
  5. 映射处理器(路径映射):

    • DispatcherServlet通过HandlerMapping(如RequestMappingHandlerMapping)根据请求的URL确定对应的处理器(如Controller)。
  6. 方法参数解析

    • 确定处理器后,DispatcherServlet会调用HandlerAdapter(如RequestMappingHandlerAdapter)来解析请求中的参数,并绑定到处理器方法的参数上。
  7. Controller方法执行

    • 一旦参数绑定完成,HandlerAdapter会调用Controller中相应的方法来处理请求。
    • 在Controller方法中,可能会调用Service层的方法来处理具体的业务逻辑。
  8. Service调用

    • Service层的方法执行实际的业务逻辑,可能与数据库进行交互或调用其他外部服务。
  9. AOP

    • 如果在Service层或Controller层使用了AOP(面向切面编程),则可能会在方法执行前后执行额外的逻辑,如记录日志、管理事务等。
  10. 视图解析(如果Controller返回的是ModelAndView):

    • 如果Controller方法返回一个ModelAndView对象,DispatcherServlet会调用ViewResolver进行视图解析,确定用于渲染的视图(如JSP、Thymeleaf等)。
  11. 渲染视图

    • 使用解析得到的视图和Controller方法返回的模型数据(Model)进行渲染,生成最终的HTML响应内容。
  12. 响应返回

    • 将渲染得到的HTML响应内容(或JSON、XML等其他格式的数据)返回给客户端。
  13. 拦截器(Interceptor)再次拦截(后处理)

    • 在Controller方法执行完毕并返回结果后,会再次经过拦截器链,用于执行后处理逻辑,如记录响应时间、清理资源等。

四、小结与使用

Spring Boot简单点理解,请求进来,返回想要的数据

Spring Boot就是请求到返回中间的流程,对于初学者来说,流程就是请求进来,到Controller,然后调用
Service做自己的业务,通过mapper沟通数据库最后一级级返回数据

而深入点就是,请求进来经过filter、Interceptor,到自己的Controller、Service,中间再检查有没有aop,看aop如何配置的,最后返回数据这一套流程

当我们了解Spring Boot和它的启动、请求流程后,总结我们使用中需要关注的点

properties或yml配置文件

各个配置数据如mysql链接账号密码信息,redis链接信息,以及自定义的配置数据

Bean的注入

@Bean@Configuration@Component@Service@Controller@Repository等注解
比如自己写的filter就通过@Component注解,交给spring管理,当请求进来时,到filter时,spring就会在管理的Bean中找到你写的filter,进行过滤,拦截器和aop同理
如redis的配置、swagger的配置等,则是通过@Configuration注解,交给spring管理
至于Controller,在@Controller注解中path写入路径,请求进来,在路径映射处理器时就会根据uri获取到对应的Bean进行调用

过滤器(Filter)

  • 过滤器是Java Servlet规范的一部分,用于在请求到达Servlet之前或响应离开Servlet之后执行代码。
    过滤器通过实现javax.servlet.Filter接口来定义。
  • 在Spring MVC应用程序中,过滤器通常用于执行诸如日志记录、字符编码设置、CORS配置、安全性检查等任务。
  • 过滤器的执行顺序是由它们在web.xml或Servlet 3.0+的@WebFilter注解中声明的顺序决定的。

优点:

  • 1.请求预处理和后处理:Filter可以在请求到达目标资源之前或响应返回给客户端之前对请求或响应进行预处理和后处理。这使得Filter非常适合用于一些公共的逻辑处理,如编码设置、用户认证等。
  • 2.容器无关性:Filter是Servlet规范的一部分,因此它可以在任何支持Servlet规范的Web容器中运行,具有良好的可移植性。
  • 3.链式处理:多个Filter可以组成一个过滤器链,按照定义的顺序依次对请求或响应进行处理。这种链式处理机制为开发者提供了很大的灵活性,可以根据需要组合不同的Filter来实现不同的功能。
  • 4.全局性:Filter可以对所有请求或响应进行统一的处理,而不需要在每个Servlet或JSP页面中单独编写代码。这有助于减少代码的冗余,提高代码的可维护性。

缺点:

  • 1.功能相对简单:与Aspect和Interceptor相比,Filter的功能相对简单,主要关注于请求和响应的预处理和后处理。因此,它无法实现像Aspect那样的复杂功能(如事务管理、安全性等)。
  • 2.作用范围有限:Filter主要关注于Web层的请求和响应处理,无法像Aspect那样跨多个层次进行横切关注点处理。
  • 3.配置和管理相对繁琐:在Web应用中配置和使用Filter需要编写额外的配置文件(如web.xml),并在其中指定Filter的类名、映射路径等信息。这增加了配置和管理的复杂性。

使用场景

  • 1.安全验证:例如,检查请求的Token是否有效,判断用户是否有权限访问该服务。
  • 2.流量控制:根据一定的规则对请求进行限流,防止服务被大量请求冲垮。
  • 3.字符编码设置:确保所有请求的字符编码都符合项目的要求。
  • 4.敏感信息过滤:在响应返回给客户端之前,过滤掉敏感信息,如密码、密钥等。
  • 5.静态资源处理:例如,对图片、CSS、JavaScript等静态资源进行缓存或压缩。
  • 6.日志记录:记录访问日志,和返回结果

拦截器(Interceptor)

  • 拦截器是Spring MVC框架的一部分,用于在请求处理之前、之后或处理过程中执行代码。
  • 拦截器通过实现org.springframework.web.servlet.HandlerInterceptor接口或扩展HandlerInterceptorAdapter类来定义。
  • 拦截器的执行顺序是由它们在Spring配置中声明的顺序决定的。可以使用mvc:interceptors标签或@Configuration类中的addInterceptors()方法来配置。

优点:

  • 1.Web层针对性:Interceptor主要针对Web层的请求和响应进行拦截和处理,如权限验证、参数校验等。这使得Interceptor在Web应用中具有天然的优势。
  • 2.简单易用:Interceptor的实现相对简单,开发者只需要实现相应的接口或继承相应的类即可。这使得Interceptor易于学习和使用。
  • 3.性能开销较小:主要相对于aop,由于Interceptor主要关注于Web层的请求和响应,其性能开销相对较小。在处理大量请求时,Interceptor通常能够提供较好的性能表现。

缺点:

  • 1.作用范围有限:Interceptor主要局限于Web层的请求和响应处理,无法像Aspect那样跨多个层次进行横切关注点处理。
  • 2.功能相对单一:Interceptor通常只关注于请求和响应的拦截和处理,无法实现像Aspect那样的复杂功能(如事务管理、安全性等)。
  • 3.可能与其他拦截器产生冲突:在一个Web应用中,可能会存在多个Interceptor。如果这些Interceptor之间存在依赖关系或冲突,可能会导致难以预料的问题。因此,在使用Interceptor时需要格外小心,并确保它们之间的协调和兼容性。

使用场景:

  • 1.权限验证:根据用户的Token或其他凭证判断用户是否有权限访问某个服务或资源。
  • 2.参数校验:在请求到达目标方法之前,对请求的参数进行校验,确保参数的有效性。
  • 3.记录请求信息:记录请求的详细信息,如请求头、请求体等,以便于后续的故障排查和性能分析。
  • 4.日志记录:记录Controller层的请求和响应信息,以便于后续的故障排查和性能分析。
  • 5.异常处理:对Controller层抛出的异常进行统一的捕获和处理。
  • 6.性能监控:统计Controller层方法的执行时间、请求次数等性能指标。

AOP面向切面编程

  • AOP是一种编程范式,用于将横切关注点(cross-cutting concerns)如日志记录、事务管理等从它们所影响的业务逻辑中分离出来。
  • 在Spring框架中,AOP是通过AspectJ或Spring AOP实现的。
  • AOP切面(Aspect)中的通知(Advice)可以在方法调用之前、之后、之前和之后、环绕方法调用时执行代码。
  • AOP通知的执行顺序是由它们在切面中定义的顺序以及它们在Spring配置中注册的顺序决定的。

优点:

  • 1.广泛适用性:Aspect可以应用于整个应用程序的不同层次,包括Controller层、Service层、Dao层等,提供了跨多个层次的横切关注点处理机制。
  • 2.代码解耦:通过将通用功能(如日志记录、事务管理、安全性等)从业务逻辑中分离出来,Aspect使得代码更加清晰、可维护,并且易于重用。
  • 3.灵活性:Aspect提供了强大的表达式语言(如AspectJ的Pointcut表达式),使得开发者可以精确地控制哪些方法或操作应该被切面所影响。

缺点:

  • 1.性能开销:主要相对于Interceptor,由于Aspect需要在运行时动态地将切面织入到目标对象中,因此可能会带来一定的性能开销。在处理大量请求或执行复杂业务逻辑时,这种开销可能会更加明显。
  • 2.调试困难:由于Aspect的横切特性,当出现问题时,调试可能会变得相对困难。开发者需要同时关注业务逻辑和切面的执行情况,以便找到问题的根源。

使用场景:

  • 1.事务管理:通过AOP实现数据库事务的切面编程,将事务管理逻辑与业务逻辑解耦。
  • 2.日志记录:通过AOP实现全局的日志记录功能,记录方法的执行时间、参数、返回值等信息。
  • 3.权限验证:根据登陆用户查询用户角色权限,判断是否有权限访问服务和资源
  • 4.性能监控:通过AOP统计方法的执行时间、请求次数等性能指标,以便于查找性能瓶颈和优化代码。

但是具体问题具体分析,比如日志处理在过滤器,拦截器和aop中都可已处理,那具体写在哪儿?
这就要看具体的使用场景,比如要在网关做访问日志,要记录所有进来的访问记录,就可以用Filter,所有的请求进来,不管是成功还是失败,还有执行时间都能记录
如果只是做个错误日志,那就可以在Interceptor做异常处理的时候实现
如果要做关键操作日志,比如关键表的增删改的操作记录,或者有的关键信息查询也要记录,就可以用Aspect(切面)实现

没有什么必须的规定,仅仅只是相对优选,比如aop功能强大,我就要所有的处理都通过aop实现,只要能实现需要的功能,也不是不行。

结语

知其然知其所以然
遇到不了解或者不知道该怎么做的时候,通过学习,去了解,明白了为什么,就自然知道该怎么做了。

现在各位同学应该知道,为什么登陆验证用过滤器,为什么登陆验证用过滤器,又在哪里写日志,统一返回处理,异常处理,以及事务管理在哪里 这些问题的答案了吧

或许知道的越多,又会产生更多的问题,欢迎大家留言,我们一起探讨,一起学习,遇到常见的问题我可能再开一篇单独的文章进行讲解
让我们一起在知识的海洋中翱翔吧。(^_^)

各位可与去看我的系列文章
【从零开始搭建web项目】
详细介绍搭建Spring Boot项目

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值