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

相关推荐
代码驿站5205 分钟前
Lua语言的函数实现
开发语言·后端·golang
武昌库里写JAVA7 分钟前
Golang的代码压缩技术应用案例分析与研究实践
数据结构·vue.js·spring boot·算法·课程设计
李歘歘13 分钟前
Golang笔记——切片与数组
开发语言·笔记·后端·golang·go
诸神缄默不语15 分钟前
Java SE 与 Java EE 简介
java·数据库·java-ee·java se
Yicsr22 分钟前
在Visual Studio中编译.c文件和.cpp文件主要有哪些不同
java·c语言·visual studio
开心呆哥30 分钟前
【python翻译软件V1.0】
java·服务器·python
raoxiaoya39 分钟前
golang中的eval,goeval,govaluate
开发语言·后端·golang
CyberScriptor1 小时前
PHP语言的软件工程
开发语言·后端·golang
TANGLONG2221 小时前
【C++】揭开C++类与对象的神秘面纱(首卷)(类的基础操作详解、实例化艺术及this指针的深究)
java·开发语言·数据结构·c++·python·考研·面试
GGBondlctrl1 小时前
【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述
java·后端·代理模式·spring aop·切点表达式