当前位置: 首页 > article >正文

SpringBoot了解

Web入门

Spring 官网 https://spring.io/

Spring 发展到今天 形成了一个开发生态圈,Spring 提供了若干个子项目,每个项目用于完成特定的功能。

SpringBoot 可以快速开发出来一个应用程序,简化开发提供效率

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.

一 请求

1 简单参数的
1>原始方式:通过HttpServletRequest 对象手动获取
package org.example.skwebtest.controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import jakarta.servlet.http.HttpServletRequest;
@RestController
public class RequestController {
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request) {
        // 获取请求参数
        String name = request.getParameter("name");
        String idStr  = request.getParameter("id");
        int id = Integer.parseInt(idStr);
        System.out.println( "name:---"+name + ":id---" + id);
        return "Hello World!";
    }
}

// 打印控制台打印出接收到的参数.
2> Springboot 方式 简单快捷

只需要确保参数名和形参名相同

@RequestMapping("/simpleParam2")
public String simpleParam2(String name ,Integer id) {
    // 获取请求参数
    System.out.println( "name:---"+name + ":id---" + id);
    return "Spirngboot方式 获取参数";
}

3 > 如果方法参数名称与请求参数名称不相同 可以使用@RequestParam 完成映射
@RequestMapping("/simpleParam3")
public String simpleParam3(@RequestParam(name = "name") String username , Integer id) {
    // 获取请求参数
    System.out.println( "username:---"+username + ":id---" + id);
    return "Spirngboot方式 RequestParam 获取参数";
}

2 实体参数

请求参数名与形参对象属性名相同即可

@RequestMapping("/simplePojo")
public String simplePojo(User user) {
    System.out.println( user);
    return "Spirngboot方式 接收pojo参数";
}



public class User {
    private String name;
    private int age;
}
3 数组集合参数

http://localhost:8080/listParam?hobby=swim&hobby=run&hobby=sing

// 数组形式
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby) {
    System.out.println(Arrays.toString(hobby));
    return "接收数组参数";
}

// 集合形式
@RequestMapping("/listParam")
public String listParam(@RequestParam  java.util.List<String> hobby) {
    System.out.println(hobby);
    return "集合形式接收参数";
}

4 日期参数
@RequestMapping("/dateParam")
// DateTimeFormat 设置接收时间的格式
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
    System.out.println(updateTime);
    return "接收日期参数";
}

5 json 参数

请求但参数

{
    "name":"fibo",
    "age":35,
    "address":{
        "province":"henan",
        "city":"pds"
    }
}

// json 参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user) {
    System.out.println(user);
    return "接收json参数";
}

6 路径参数

通过请求URL 直接传递参数,使用{…}来标识该路径参数,需要使用PathVariable 进行标注
http://localhost:8080/pathParam/55

// 路径参数
@RequestMapping("/pathParam/{id}")
public String pathParam(@PathVariable("id") Integer id) {    // 路径参数
    System.out.println(id);
    return "接收路径参数";
}

二 响应

响应设置一个统一的响应结果

@ResponseBody 将方法返回值直接响应,若返回值类型是实体对象或者集合,转JSON 格式响应

// 字符串类型
@RequestMapping(value = "/hello1")
public Result getString() {
    return new Result(200, "hello world", "success");
}
// 对象类型
// 返回的对象 默认是会被转为json格式
@RequestMapping(value = "/address")
public Result getAddress() {
    Address address = new Address();
    address.setProvince("广东");
    address.setCity("深圳");

    return  new Result(200, address, "success");
}

// 数组类型
@RequestMapping(value = "/listAddress")
public Result getListAddress() {
    List<Address> list = new ArrayList<>();
    Address address1 = new Address();
    address1.setProvince("广东");
    address1.setCity("广州");
    list.add(address1);
    Address address2 = new Address();
    address2.setProvince("江苏");
    address2.setCity("南京");
    list.add(address2); // 省份为空

    return  new Result(200, list, "success");
}

三 三层架构模式

controller : 控制层,接收前端发送的请求,对请求进行处理,并相应数据。
service: 业务逻辑层,处理具体的业务逻辑
dao: 数据访问层(Data Access Object)(持久层 ),负责数据访问操作,包括数据的增删改查

四 分层解耦 IOC 和 DI

1 基本概念
内聚:软件中各个功能模块内部的功能联系
耦合: 衡量软件中各个层/模块之间的依赖,关联的程度
软件设计原则:高内聚低耦合

控制反转: Inversion Of Control ,简称IOC,对象的创建控制权由程序自身转移到外部(容器),这种思想称之为控制反转
依赖注入:Dependency Injection ,简称DI 。容器为应用程序 提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:IOC 容器中创建,管理的对象,称之为bean

类之前 @Component ,将当前类交给IOC容器管理,成为IOC 容器之中的bean
@Autowired 运行时 ,IOC 容器会提供该类型的bean对象,并赋值给该变量,这就是依赖注入

2 IOC 详解

@Component 通用类组件注解,该类被注解,IOC容器启动时实例化此类对象
@Controller 注解控制器类
@Service 注解业务逻辑类
@Respository 注解和数据库操作的类,如DAO类

前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan 扫描
这个注解默认是在@SpringBootApplication中,默认扫描范围是启动类所在包及其子包

3 DI 详解

@Autowired 注解,默认是按照类型进行,如果存在多个相同类型的bean,将会出现报错

无法自动装配。存在多个 ‘EmpService’ 类型的 Bean。

通过一下几种方案来解决:

@Primary 是用来设置bean 的优先级,要想让哪个bean 生效,在其上方加此注解

@Qualifier 配合autowired 进行制定 @Qualifier(“empServiceA”)

@Resource 这个是jdk 提供的,单独使用直接制定名字也可以 @Resource(name = “empServiceA”)


http://www.kler.cn/a/500285.html

相关文章:

  • 后端服务集成ElasticSearch搜索功能技术方案
  • 41_Lua函数
  • Uniapp Android 本地离线打包(详细流程)
  • 大型语言模型(LLM)中的tokens是什么
  • Angular 最新版本和 Vue 对比完整指南
  • css面经
  • 【gRPC】Keepalive连接保活配置,go案例
  • django基于Python的电影推荐系统
  • The First项目报告:浅析自我改进的人工智能代理TAOCAT
  • OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性
  • 3D立体无人机夜间表演技术详解
  • CCF 赛事介绍
  • 今日总结 2025-01-09
  • 机器人避障不再“智障”:HEIGHT——拥挤复杂环境下机器人导航的新架构
  • CRTP编程模式(奇异递归模板)实现客户端的https管理模块
  • windows 环境下安装yarn命令工具
  • HTB:Paper[WriteUP]
  • vue条件渲染
  • 【灵码助力安全3】——利用通义灵码辅助智能合约漏洞检测的尝试
  • 基于springboot的医药管理系统源码+论文+开题报告
  • 单片机(MCU)-简单认识
  • 119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR
  • C++ Primer Notes(3): 哪些人可以看C++ Primer
  • 探索微软 M365 安全:全方位守护数字世界
  • 基于单片机的小功率数控调频发射器设计