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")

相关推荐
一只叫煤球的猫6 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9657 小时前
tcp/ip 中的多路复用
后端
bobz9657 小时前
tls ingress 简单记录
后端
皮皮林5518 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友8 小时前
什么是OpenSSL
后端·安全·程序员
bobz9658 小时前
mcp 直接操作浏览器
后端
前端小张同学11 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook11 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康11 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在12 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net