Springboot项目学习之各组件的用法和逻辑结构

1.Controller层(Controller)

        也称为前端控制器或请求处理器,它是项目与用户交互的入口。Controller接收HTTP请求,解析请求参数,调用Service层处理业务逻辑,并返回响应给客户端。

Controller通常使用@RestController或@Controller注解。

@Controller注解:

        @Controller注解用于定义一个控制器类,通常用于创建Web应用程序中的控制器。在使用@Controller注解时,方法通常返回一个视图(View),该视图会被解析器解析并返回给客户端。这意味@Controller通常用于创建传统的MVC应用程序。

@Controller示例:
@Controller
public class MyController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
}
为什么说是返回了一个视图,详细解释为什么返回的是视图?为什么要返回视图?

        在使用@Controller注解时,控制器方法通常返回一个视图(View)对象,该对象表示要渲染的用户界面。这是因为@Controller注解用于创建传统的MVC(Model-View-Controller)应用程序,其中View对象是模型(Model)和控制器(Controller)之间的桥梁,负责将模型的数据渲染到用户界面上。

        当控制器方法返回一个视图对象时,该对象会被视图解析器(ViewResolver)解析为一个实际的视图,并将其渲染为HTTP响应。视图解析器根据视图名称和视图解析器配置来决定要渲染哪个视图。

        返回视图对象的优点在于,它可以将模型和视图的分离实现得更加清晰,使得开发人员可以更好地控制应用程序的行为。控制器方法只需关注如何获取和处理数据,而不需要关心如何将数据渲染到用户界面上。这种分离可以提高应用程序的可维护性和可扩展性,使得开发人员可以更好地重用和测试代码。

        此外,返回视图对象还可以使得应用程序更加灵活,因为视图解析器可以根据需要将视图对象渲染为不同的格式,如HTML、XML、JSON等。这使得应用程序可以支持多种输出格式,从而更好地适应不同的用户需求和场景。

总之,返回视图对象的原因在于,它可以将模型和视图的分离实现得更加清晰,使得开发人员可以更好地控制应用程序的行为,并使应用程序更加灵活和可维护。

@RestController注解:

        @RestController注解是@Controller的一个特化版本,它结合了@Controller和@ResponseBody注解的功能。使用@RestController注解的类,所有方法的返回值会直接以JSON或XML格式写入HTTP响应体中,而不会经过视图解析器进行渲染。因此,@RestController通常用于创建RESTful风格的Web服务。

@RestController示例:
@RestController
public class MyRestController {
    @RequestMapping("/api/hello")
    public String hello() {
        return "Hello, World!";
    }
}

        在上面的例子中,hello()方法返回一个Map<String, String>对象,该对象被标注为@ResponseBody。这意味着该对象会被直接转换为JSON格式,并发送给客户端。

        需要注意的是,在使用@ResponseBody时,控制器方法的返回值类型必须是一个支持序列化的对象,如String, Map, List等。如果需要返回其他类型的对象,可以使用Jackson或其他序列化库将该对象转换为JSON或其他格式。

什么是RESTful风格的Web服务?

        RESTful(Representational State Transfer)风格的Web服务是一种设计Web服务的架构风格,它是基于HTTP协议和统一资源定位器(URL)的架构风格。RESTful Web服务遵循REST原则,使用HTTP方法(如GET、POST、PUT、DELETE等)来操作资源,使用URL来唯一标识资源,使用标准的MIME类型(如JSON、XML等)来表示资源的状态。

RESTful Web服务的主要特点如下:

        资源(Resource):RESTful Web服务中的所有内容都被视为资源,资源可以是一个实体、一个 concept(一个抽象的、可以被表示和操作的思维或信息单元。它并不直接对应数据库中的实体,而是一个更广泛的概念,可以是数据模型中的一个属性、一个业务逻辑的结果,或者是一个业务规则。例如,一个“天气预报”的概念可能包含多个具体的天气数据点,如温度、湿度等。)、或一个 service,每个资源都有一个唯一的URI(统一资源标识符的缩写,用于唯一标识互联网资源的字符串序列)。

        表示(Representation):资源的表示方式可以是多种多样的,如JSON、XML、HTML等,客户端和服务器可以通过Accept和Content-Type头来约定资源的表示方式。

        状态转移(State Transfer):RESTful Web服务鼓励将服务器的状态传递给客户端,客户端可以根据服务器的状态来操作资源,从而实现无状态的通信。

         无状态(Stateless):RESTful Web服务要求每个请求都必须包含所需的所有信息,服务器不能存储客户端的任何状态信息,这使得RESTful Web服务具有可伸缩性和可靠性高的特点。

        分层系统(Layered System):RESTful Web服务可以通过分层的架构来实现,每层之间可以通过统一的接口来交互,这使得RESTful Web服务具有可扩展性和可维护性高的特点。

RESTful Web服务的优点:

它可以使用标准的HTTP协议和URL来实现简单、统一、可扩展的API,使得开发人员可以更好地开发和集成应用程序。此外,RESTful Web服务还可以支持多种表示方式,使得应用程序可以更好地适应不同的用户需求和场景。

什么是@ResponseBody注解?

        @ResponseBody是一个Spring注解,用于将控制器方法的返回值直接写入HTTP响应体中,而不是被视图解析器解析并渲染为视图。当在控制器方法中使用@ResponseBody时,该方法的返回值会被转换为指定的格式,并直接发送给客户端。

@ResponseBody返回一个JSON对象的示例:
@RestController
public class MyController {

    @GetMapping("/hello")
    public @ResponseBody Map<String, String> hello() {
        Map<String, String> map = new HashMap<>();
        map.put("message", "Hello, World!");
        return map;
    }
}

        在上面的例子中,hello()方法返回一个Map<String, String>对象,该对象被标注为@ResponseBody。这意味着该对象会被直接转换为JSON格式,并发送给客户端。

        需要注意的是,在使用@ResponseBody时,控制器方法的返回值类型必须是一个支持序列化的对象,如String, Map, List等。如果需要返回其他类型的对象,可以使用Jackson或其他序列化库将该对象转换为JSON或其他格式。

总之,@ResponseBody注解用于将控制器方法的返回值直接写入HTTP响应体中,而不是被视图解析器解析和渲染为视图。这可以用于返回JSON或其他格式的数据,以满足AJAX请求或其他需要返回数据的场景。

为什么使用@RestController注解而不使用@ResponseBody注解?

        因为@RestController是@Controller和@ResponseBody的组合注解,可以简化控制器类的编写。当在控制器类上使用@RestController时,该类中所有的方法都会被视为返回HTTP响应体,从而省去了每个方法上都需要添加@ResponseBody的麻烦(这个想法很Java!)。

2.Mapper层(Mapper):

        数据访问层,它负责将业务对象(如Model)转换为数据库操作的SQL语句(如JPA或MyBatis),以及将数据库查询结果转换回业务对象。Mapper接口通常使用@Mapper注解。

3.Model层(Model):

        也称为领域模型或业务对象,它封装了业务数据和业务逻辑。Model层不直接处理数据库操作,而是通过Service层与数据库交互,它的目的是将业务逻辑与数据操作解耦。

4.Service层(Service):

        服务层是业务逻辑的核心部分,它处理复杂的业务规则、数据验证、业务协调等。Service层通常会调用Mapper层来执行数据库操作,并将结果转换为Model对象或直接返回。

5.Handlers层(Handler):

        这个术语在一些项目中可能不常见,但如果你指的是错误处理或全局处理,它可能指处理HTTP异常的类,如@ExceptionHandler注解的类,用于捕获并处理Controller抛出的异常。

6.Commons层(Commons):

        也称为工具库或基础库,它包含项目中重复使用的通用功能,如日志处理、异常处理、日期时间操作、文件操作等。这些代码通常被多个层共享。

上述组件之间的逻辑关系:

用户请求通过Controller层到达,Controller调用Service层处理业务逻辑。Service层通过Mapper层操作数据库,Mapper将Model对象和数据库操作绑定起来。

Service层处理完业务后生成Model对象,或者直接返回结果给Controller。Controller负责将结果转换为HTTP响应并返回给客户端。

如果在处理过程中出现异常,可能被Handlers层捕获并转化为友好的错误信息返回。

Commons层提供了一致的编程接口和通用工具,使得其他层的代码更加简洁和可维护。

Spring 框架(Spring Framework):

Spring Boot 基于 Spring Framework,提供了核心功能,如依赖注入、AOP、事务管理、数据访问等。

Spring Web 模块:

提供了 Web 应用的基础支持,如 Servlet、控制器、模板引擎等。

可选模块:

      Spring Boot Actuator:提供应用监控和管理功能,如健康检查、度量指标、配置管理、跟踪和过滤等。

Spring Boot Security:提供安全相关的功能,如身份验证、授权、基于角色的访问控制等。

      Spring Boot Cloud:提供云原生应用的支持,如服务发现、配置中心、负载均衡、分布式追踪等。

Spring Boot Test:提供了测试相关的功能,如自动配置测试环境、模拟服务等。

各模块之间的关系:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值