310
社区成员




Spring Boot是一个用于快速构建Java应用的框架,尤其适用于微服务架构。
MVC 模式实现业务逻辑与视图分离,支持团队协作。
我在团队开发中因缺乏Java和Spring Boot经验而遇到挑战,但通过不断学习和实践,我逐渐掌握了Spring Boot与Java的基础知识,理解自动配置机制、MVC 组件交互及异常处理,并在项目中实现了功能。
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。它使用“约定优于配置”(Convention Over Configuration)的理念,极大地简化了基于 Spring 的应用开发。
MVC 模式(Model-View-Controller)是一种用于设计创建 web 应用程序和软件的可扩展性架构模式。在 Spring Boot 中,MVC 模式主要由 Controller、Service、Repository(或 Mapper)和 Entity(或 Model)等组件构成。
Spring Boot 与 MVC 模式的结合,允许开发者快速构建、测试和部署可扩展的 web 应用程序。通过自动配置和简化的依赖管理,开发者可以专注于业务逻辑的实现,而无需过多关注底层配置和集成。
学习并使用 Spring Boot 与 MVC 模式的原因主要有两点:
MVC是最耳熟能详的架构,团队都理解,便于合作开发
团队大部分同学都更擅长Java语言
对于我个人而言难点主要集中在以下几个方面:
理解 Spring Boot 的自动配置机制和工作原理。
熟练掌握 MVC 模式的各个组件及其之间的交互关系。
理解和处理可能出现的异常和错误情况。
以下将结合上面列出的项目结构,介绍mvc架构。
在Model部分,主要负责数据持久化和数据传输对象的定义。这对应于src/main/java/com/dogcat/entity
目录。
Entity(实体类):我们定义了与数据库表结构相对应的Java对象。例如,User.java
、Post.java
、Comment.java
等。这些类包含与数据库表字段相对应的属性和getter/setter方法。
DTO(数据传输对象):在Service层与Controller层之间,我们使用了DTO来传输数据。在entity/DTO
子目录下,我创建了一系列的DTO类,如AuthenticationRequest.java
、CommentDTO.java
、PostDTO.java
等,用于封装从Service层返回给Controller层的数据,或者从Controller层传递给Service层的数据。
VO/:VO(View Object)通常用于展示层,用于封装需要展示给前端的数据。VO被放在了entity/VO/
目录下。
result/:这个目录下包含了结果封装类,如PageResult.java
和Result.java
,它们通常用于封装API的响应结果。
在Spring Boot的Web应用中,View通常指的是前端页面或模板。然而,由于我们的项目结构中没有直接包含前端页面的部分,我们将View视为以数据响应(我们用JSON)的形式返回给客户端的。在Controller层,我处理HTTP请求并返回响应,这可以看作是View的一种实现。
在Controller层,我负责处理HTTP请求,并调用Service层来处理业务逻辑。这对应于src/main/java/com/dogcat/controller
目录。例如:
UserPostController.java:这个类包含与userpost
相关的HTTP请求处理方法。例如,我实现了一个方法用于处理用户发布帖子的请求。在该方法中,我调用Service层的相应方法来处理业务逻辑,并将结果以JSON或XML等格式返回给客户端。
Service层是业务逻辑的核心部分,我负责处理与业务相关的操作,并且与Controller层紧密协作。
UserService.java 和 PostService.java(假设存在):这些类包含与用户和帖子相关的业务逻辑方法。例如,在UserService
中,我实现了注册用户、登录用户、获取用户信息等方法;在PostService
中,我实现了发布帖子、获取帖子列表、删除帖子等方法。
mapper/:这个目录下包含了所有的MyBatis Mapper接口,用于操作数据库。这些接口定义了如何与数据库进行交互。
util/:这个目录下包含了项目中使用的工具类,如AliOssUtil.java
(用于与阿里云OSS进行交互)和JwtUtil.java
(用于处理JWT相关的操作)。
filter/:这个目录下包含了用于处理HTTP请求的过滤器,如JwtRequestFilter.java
(用于在请求中验证JWT令牌)。
其实在java和resources下分别有一个mapper文件夹。
【分析】而java中的mapper是用java语言写的,而resources下是用xml语言写的。
当我进行函数调用的时候,我将两个mapper文件夹下所需的增删改查都用了同样函数名的函数,并都实现了。
【冲突】后来调用的时候发现会冲突。因为,调用resources的mapper就不能调用java的mapper了。
【原因】不然程序无法辨别你到底调用的是哪个文件夹下的函数。所以我得到了个结论是,这两个文件夹下的函数是同等级的,都会被扫描到。
因为关于项目有太多问题和解决可以分享了,所以这里分享另一些令我印象深刻的问题。
JWT产生token出来后,怎么加到Header里呢?我以为直接把token放到Author里就行,但是其实前面要加一个 Bearer和空格。
【Python】这和Python就不一样,Pyhton的flask架构,校验时是不用加这个标识的。
这是Java特有的。
【Python】在Python里,JWT鉴权可以以注解的方式在每一个url前加上,表示要先鉴权才可以继续下一步。
而在Sprinboot里,写好了JWT时,设定哪些路由需要鉴权,是在函数内定义的。如下:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf(csrf -> csrf.disable()) .authorizeHttpRequests(auth -> auth .requestMatchers("/authenticate").permitAll() .requestMatchers("/frontend/user/login").permitAll() .requestMatchers("/frontend/user/register").permitAll() .requestMatchers("/frontend/**").authenticated() .requestMatchers("/backend/**").permitAll() .anyRequest().permitAll() ) .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ); http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); }
一开始下载项目直接运行后,发现把接口文档下载到自己软件上时,直接调试是不能成功的。
【原因】因为接口文档只会把url载入,而body等内容是不会同步的,每次电脑开关机也都会消失,需要每次都手动输入。
在这篇技术博客中,我详细回顾了自己在团队开发过程中使用Spring Boot框架和MVC模式的经历。起初,由于对Java和Spring Boot不够熟悉,我在项目开发中遇到了不少挑战。然而,通过持续的学习和实践,我逐步掌握了Spring Boot的基础知识,深入理解了其自动配置机制、MVC模式中各个组件之间的交互,以及如何有效处理异常。
我认识到Spring Boot之所以能简化新Spring应用的搭建和开发过程,是因为它采用了“约定优于配置”的理念。在MVC模式中,我了解了Controller、Service、Repository和Entity等组件的作用,它们共同构成了一个可扩展的web应用程序架构。我学习到,团队之所以选择MVC模式,一方面是因为它广为人知,便于团队合作开发;另一方面是因为团队成员普遍擅长Java语言。
在实际开发中,我面临了一些技术难点,包括理解Spring Boot的自动配置机制、熟练掌握MVC模式的组件交互,以及处理异常和错误。我通过实际操作,逐渐克服了这些难点。例如,在项目架构中,我负责了Model部分,包括数据持久化和数据传输对象的定义。我创建了实体类、DTO、VO以及结果封装类,以适应不同层次的数据需求。
我还遇到了一些具体的问题,比如Java和XML两种不同形式的Mapper冲突问题,我通过分析和实践解决了这一冲突。在JWT鉴权方面,我学习了如何在Spring Boot中正确地将token添加到Header,并设置了哪些路由需要鉴权。我还分享了使用Apipost进行接口调试时遇到的问题,以及如何确保调试的顺利进行。
总的来说,通过这一系列的学习和实践,我不仅提升了自己的技术能力,还加深了对团队协作重要性的认识。这些经验对我未来的软件开发职业生涯无疑是宝贵的财富。
很赞,唯一的小遗憾就是概述字数超出要求,其他的部分很详细~