springboot学习整理

视频:基础篇-01_springboot概述_哔哩哔哩_bilibili

介绍

        spring boot 是spring提供的一个子项目,用于快速构建spring应用程序

        spring构建: 1 导入依赖繁琐 ; 2 项目配置繁琐

spring Framework: 核心

spring Boot :快速构建spring项目

spring Data: 数据获取

spring cloud:服务治理

spring AMQP:消息传递

spring Security: 认证授权

springboot特点

  • 起步依赖: 本质是一个maven坐标,整合了完成一个功能需要的所有坐标
    • spring-boot-starter-web包,包含了多个开发web相关的依赖,整合在一起
  • 自动配置: 遵循约定大于配置,在boot程序启动后,一些bean对象会自动注入道ioc容器
  • 其他特性
    • 内嵌的tomcat,jetty(无需部署war文件,只需要打jar包)
    • 外部化配置(修改项目外面的配置文件)
    • 不需要xml配置(properties/yml)

搭建一个最简单的项目

如果是1.8版本: server url 改成:start.aliyun.com ,java选择8 

// 1 启动类注解 @SpringBootApplication
@SpringBootApplication
public class Demo2Application {public static void main(String[] args) {SpringApplication.run(Demo2Application.class, args);}}// 2 controller类注解 @RestController
@RestController
public class UserController {@GetMapping("/hello")@ResponseBodypublic String hello(){System.out.println("Hello");return "Hello";}
}

再加个配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 3 boot 工程的父工程,用于管理起步依赖的管理 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</version></parent><groupId>org.example</groupId><artifactId>testPeizhi</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- 4 web的依赖包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

配置文件:application.properties / application.yml

application.properties相关配置的官方文档:Common Application Properties

bootstrap不生效

yml

server:port: 7080context-path: /test# 字段获取
@Value("${server.port}")
# 如果没配置,会报错,可以设置默认值
@Value("${键名:}")# 类上获取
@ConfigurationProperties(prefix = "email")
@Component
hobbies:- 打篮球- 打豆豆# 获取数组,适用@ConfigurationProperties,不适用@Value
private List<String> hobbies;

解决方法:解决@value获取不到yaml数组的问题_@value 数组-CSDN博客 

 

Java基础篇--YML简介_java yml-CSDN博客

 

手动创建module

 

 

Bean管理

bean扫描

@SpringBootApplication组合:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan@Componentscan 一般不配置路径,默认扫描启动类所在的包,及其子包如果在其他地方的包也要扫描到:
@SpringBootApplication
@ComponentScan(basePackage = "com.chinaoly")

bean注册

@Component      声明bean的基础注解     不属于以下三类的,用此注解
@Controller     component的衍射注解    标注在控制器上
@Service        component的衍射注解    标注在业务类上
@Repository     component的衍射注解    标注在数据访问类上(用于和mybatis整合,用的少)如果是第三方的文件注入
@Bean
@Import不推荐放在启动类,建议单独的配置文件
@Configuration
public class Commonfig{@Bean   //  @Bean("resolver1") 改名public Resolver resolver(){return new Resolver();}@Bean   // 用参数方式从yml获取配置值public Resolver resolver2(@Value("${email.name}")String name){return new Resolver();}
}@Import(Commonfig.class) //如果Commonfig不在启动类的包和子包下,使用import注解可以导入Commonfig以及里面的bean
@Import({xxx.class,xxx.class...})
或
@Import(CommonImportSelector.class)public class CommonImportSelector implemenets ImportSelector{@Overridepublic String[] selectImport(AnnotationMetadata importingClassMetadata){return new String[]{"...XXX.class","...xxx.class"}}}检查注入情况
ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);
XXX xxx = context.getBean(XXX.class); // context.getBean("name")  beanName默认是方法名
System.out.println(xxx);

获取resource下的文件

@Configuration
public class ClassImporter implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {InputStream is = ClassImporter.class.getClassLoader().getResourceAsStream("11111.text");BufferedReader br = new BufferedReader(new InputStreamReader(is));String line = null;try {while ((line = br.readLine()) != null){System.out.println(line);}br.close();}catch (IOException e){e.printStackTrace();}finally {if (br != null){try {br.close();} catch (IOException e) {throw new RuntimeException(e);}}}return new String[]{"com.example.extend.Country"};}
}

 

注册条件

SpringBoot提供了设置注册生效条件的注解:
@Conditional此注解用起来麻烦,常用衍射注解
@ConditionalOnProperty     配置文件中存在对应的数下,才声明bean
@ConditionalOnMissingBean     当不存在当前类型的bean时,才声明当前bean
@ConditionalOnClass        当前环境存在指定的类时,才声明bean@Configuration
public class CommonConfig {// country 下有name,ip 都配置了才生效@ConditionalOnProperty(prefix = "country",name = {"name","ip"})@Beanpublic Country restTemplate(@Value("${country.name}")String name, @Value("${country.ip}")String ip){Country country = new Country();country.setUsername(name);country.setIp(ip);return country;}// 不存在country,则注入@Bean@ConditionalOnMissingBean(User.class)public Country country(){}// 某个类存在才注入@Bean@ConditionalOnClass(name = "全类名")public Country country1(){}
}

自动配置

        遵循约定大于配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器中。

内容参考视频,存在如下问题

spring 6.0.1或spring boot 3的自动装配问题 spring.factoriess不生效问题_spring.factories 不生效-CSDN博客

校验

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

参数上加校验 

实体类上加校验 

 

JWT

    <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version></dependency>
   // 获得tokenprivate String getToken(){Map<String, Object> chaims = new HashMap<>();chaims.put("id","");chaims.put("name","");String token = JWT.create().withClaim("user", chaims).withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 3)).sign(Algorithm.HMAC256("momolihahahah"));return token;}// 验证tokenprivate boolean parseToken(String token){JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("momolihahahah")).build(); // JWT验证对象DecodedJWT decodedJWT = jwtVerifier.verify(token);Map<String, Claim> claims = decodedJWT.getClaims();Claim user = claims.get("user");Map<String, Object> chaims = user.asMap();return true;}

登录认证-拦截器

注解 

@RequestHeader

@PostMapping("/fangwen")public Boolean fangwen(@RequestHeader(name = "Authorization")String token){return false;}

@JsonIgnore

// 例如密码,转换成json返回的时候不希望显示出来,可用此注解@JsonIgnoreprivate String password;

mybatis:启动 数据库_ 映射 实体类的驼峰命名

mybatis:configuration:map-underscore-to-camel-case: true

ThreadLocal工具类: P22

// ThreadLocal 线程安全,但用完要清除,避免内存泄露
public class ThreadLocalUtil {private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();public static <T>  T get(){return (T) THREAD_LOCAL.get();}public static void set(Object obj){THREAD_LOCAL.set(obj);}public static void remove(){THREAD_LOCAL.remove();}
}

@RequestBody

// 请求的参数以json格式传输,转换成 实体类 或 map,用RequestBody注解
@RequestMapping("/hello")public String hello(@RequestBody MyEmail email) {return "Hello " ;}

@RequestParam

    @RequestMapping("/hello")@ResponseBodypublic String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {List<String> hobbies = myEamil.getHobbies();System.out.println();
//        hobbies.forEach(e-> System.out.println(e));return "Hello " + name;}

@RequestParam和@PathVirable和@RequestBody区别-CSDN博客

@JsonFormat

// json实体中日期返回格式配置@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;

分组校验

default分组

自定义注解: P33

 

集成redis

 

多环境开发: P44

 如果特定环境中的信息和通用环境中的信息冲突,特定环境的生效

如果配置信息多,拆分

 

共性配置还是非常多,继续拆分维护 P45

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

秒杀系统之设计方向

1 秒杀存在的问题 对于一个日常平稳的业务系统&#xff0c;如果直接开通秒杀功能的话&#xff0c;往往会出现很多问题—— 2 设计方向的思考 秒杀本质是要求一个瞬时高发下的承压系统&#xff0c;这也是其区别于其他业务的核心场景。对日常系统秒杀产生的问题逐一进行拆解分…

深入浅出:ConcurrentLinkedQueue源码分析与实战

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

CentOS使用Docker搭建Nacos结合内网穿透实现无公网IP远程登录本地管理平台

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Nacos Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…

网站服务器备案及域名购买配置教程

一、阿里云服务备案准备工作 1.什么是备案? 备案是指向相关部门提交网站信息,以便监管和管理互联网信息服务,未经备案的网站可能面临罚款甚至被关闭的风险。备案主要看您的网站或App等互联网信息服务解析到的服务器是否在中国内地(大陆),如果服务器在中国内地(大陆),…

探索Python中的文件操作:如何列出一个目录下的所有文件?

在Python中&#xff0c;处理文件和目录是一项常见的任务。无论是在数据科学项目中读取数据集&#xff0c;还是在Web开发中管理用户上传的文件&#xff0c;我们都需要知道如何列出一个目录下的所有文件。本文将通过通俗易懂的语言&#xff0c;为初学者详细讲解如何在Python中实现…

Tkinter组件:Text-显示和处理多行文本

Tkinter组件&#xff1a;Text Text&#xff08;文本&#xff09;组件用于显示和处理多行文本。在 Tkinter 的所有组件中&#xff0c;Text 组件显得异常强大和灵活&#xff0c;适用于多种任务。虽然该组件的主要目的是显示多行文本&#xff0c;但它常常也被用于作为简单的文本编…

kali更新镜像源

1. 什么是镜像源 镜像源一种数据存储和分发技术&#xff0c;通常指的是一个服务器或网站&#xff0c;它存储了另一个服务器或网站上的某些或全部内容的副本。 2. kali更新镜像源 1. 编辑镜像源文件 vi /etc/apt/sources.list 2. 将原来的镜像源用#号注释掉 3. 选择镜像源地址…

LLM应用-文档解析 AI大模型总结分析文档

1&#xff09;https://notegpt.io/pdf-summary 支持总结&#xff0c;思维导图、对话 2&#xff09;chatdoc https://chatdoc.com/ 3&#xff09;chatpdf https://www.chatpdf.com/ https://www.chatpdfs.cn/ 4&#xff09;kimi https://kimi.moonshot.cn/

HTML静态网页成品作业(HTML+CSS+JS)——华为商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现首页图片切换轮播效果&#xff0c;共有1个页面…

Cweek1

C语言学习 一.初识C语言 1.如何写C代码 ①创建工程 ②添加源文件&#xff1a;c文件&#xff1a;源文件&#xff0c;h文件&#xff1a;头文件 代码实例&#xff1a; main函数是程序的入口&#xff0c;有且仅有一个 在C语言中&#xff0c;#include <stdio.h> 是一个预…

嵌入式学习-时钟树

时钟树 时钟分类 时钟树框图 LSI与LSE HSI、HSE与PLL 系统时钟的产生 AHB、APBx的时钟配置 相关寄存器 寄存器部分的细节内容请参考手册。 相关库函数

PyQt5中Text Edit的常用方法和常用信号

文章目录 1. 简介1.1. 常用方法&#xff1a;1.2 常用信号&#xff1a; 2. Text Edit的常用方法使用案例3. Text Edit 的常用信号使用案例 1. 简介 QTextEdit是PyQt中用于显示和编辑文本的强大组件之一。它提供了丰富的功能&#xff0c;可以显示普通文本、富文本和HTML文本&…

e行64位V11.17.4 安卓全局虚拟定位APP

e行最新版11.17.4 支持全局虚拟位置 小米手机 百度地图 高德地图 实测成功 其他app自测 不一定支持所有app 下载&#xff1a;https://www.123pan.com/s/HAf9-tsyCh.html

java多线程 线程交替执行(同步)的各种实现方案

目录 java多线程 线程交替执行&#xff08;同步&#xff09;的各种实现方案需求 指定具体执行顺序实现一&#xff1a;wait_notify机制 Thread标志位实现二&#xff1a;lock_condition机制 Thread标志位实现三&#xff1a;semaphore信号量 不指定具体执行顺序&#xff0c;只交…

Electron + GitHub Actions | 自动化流程详解(下)

自动化部署 上篇介绍了 Electron Forge 打包应用教程。在实际开发中&#xff0c;自动化是提升效率和产出质量的关键。本篇我们将详细介绍如何将构建和发布 Electron 应用的过程自动化。 代码挂在 GitHub 仓库上&#xff0c;如果有帮助&#xff0c;记得给仓库点个赞&#xff1a…

MQTT学习(一)

MQTT是一种与HTTP类似的应用层协议。 在某些物联网应用中&#xff0c;MQTT优于HTTP。 首先&#xff0c;HTTP是用于客户端服务器计算的以文档为中心的请求-响应协议。 HTTP是万维网的基础&#xff0c;但它不是专门为机器之间通信而设计的。 MQTT是一种机器对机器、以数据为中…

Python pyqtgraph库:高效可视化数据的利器

更多Python学习内容&#xff1a;ipengtao.com 在数据科学和工程领域&#xff0c;数据可视化是一项非常重要的任务。Python pyqtgraph库是一个功能强大的数据可视化工具&#xff0c;可以帮助用户快速、高效地可视化各种类型的数据&#xff0c;包括实时数据、大数据集和3D数据等。…

英伟达解码性能NVDEC

如果你能打开官网&#xff0c;请看这里&#xff1a; NVDEC Application Note 下面是摘录&#xff1a;

STL---排序模板参数

map 对map进行排序 首先一定要注意map模板类的第三个模板参数&#xff0c;这个参数决定元素按键值升序或者降序在map中的存储方式&#xff1a; 默认&#xff1a;less<key>升序----- < -----第一个小于取第一个 可设置&#xff1a;greater<key>降序-------…

VC 编程开发中的 封装类 :log日志类 和SQL server 操作类 源代码

VC 编程开发中的 封装类 &#xff1a;日志类 和SQL server 操作类 源代码 在VC&#xff08;Visual C&#xff09;开发中&#xff0c;日志文件输出是一个至关重要的环节&#xff0c;它对于程序调试、问题排查以及系统监控等方面都具有不可替代的作用。以下是对日志文件输出在VC开…