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.rhkb.cn/news/326814.html

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

相关文章

gitee 简易使用 上传文件

Wiki - Gitee.com 官方教程 1.gitee 注册帐号 (直接选择初始化选项即可&#xff0c;无需下载git&#xff09; 2.下载git 安装 http://git-scm.com/downloads 3. 桌面 鼠标右键 或是开始菜单 open git bash here 输入&#xff08;复制 &#xff0c;粘贴&#xff09; 运行…

移动端自动化测试工具 Appium 之自定义报告

文章目录 一、背景二、具体实现1、保存结果实体2、工具类3、自定义报告监听类代码4、模板代码4.1、report.vm4.2、执行xml 三、总结 一、背景 自动化测试用例跑完后报告展示是体现咱们价值的一个地方咱们先看原始报告。 上面报告虽然麻雀虽小但五脏俱全&#xff0c;但是如果用…

【错误的集合】力扣python

最初想法 def findErrorNums(nums):n len(nums)duplicate -1missing -1for num in nums:if nums[abs(num) - 1] < 0:duplicate abs(num)else:nums[abs(num) - 1] * -1for i in range(n):if nums[i] > 0:missing i 1breakreturn [duplicate, missing] 遇到力扣大佬…

RedisTemplate操作Redis详解之连接Redis及自定义序列化

连接到Redis 使用Redis和Spring时的首要任务之一是通过IoC容器连接到Redis。为此&#xff0c;需要java连接器&#xff08;或绑定&#xff09;。无论选择哪种库&#xff0c;你都只需要使用一组Spring Data Redis API&#xff08;在所有连接器中行为一致&#xff09;&#xff1a;…

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入&#xff1a;若GPIO引脚配置为上拉输入模式&#xff0c;在默认情况下&#xff08;GPIO引脚无输入&#xff09;&#xff0c;读取的GPIO引脚数据为1&#xff0c;即高电平。 下拉输入&#xff1a;若GPIO引脚配置为下…

如何将pdf文件换成3d模型?---模大狮模型网

PDF文件是一种广泛用于文档传输和共享的格式&#xff0c;但在某些情况下&#xff0c;我们可能希望将其中的内容转换为更具交互性和视觉效果的3D模型。本文将介绍如何将PDF文件转换为3D模型&#xff0c;为您展示实现这一想象的步骤。 选择合适的PDF文件&#xff1a; 首先&#…

CentOs搭建Kubernetes集群

kubeadm minikube 还是太“迷你”了&#xff0c;方便的同时也隐藏了很多细节&#xff0c;离真正生产环境里的计算集群有一些差距&#xff0c;毕竟许多需求、任务只有在多节点的大集群里才能够遇到&#xff0c;相比起来&#xff0c;minikube 真的只能算是一个“玩具”。 Kuber…

如何开通微软必应bing国内竞价广告账户?

微软必应Bing作为全球第二大搜索引擎&#xff0c;凭借其特有的用户群和市场定位&#xff0c;为中国广告主开辟了一片潜力无限的蓝海市场。云衔科技通过专业实力&#xff0c;为广告主提供全方位支持&#xff0c;从开户到代运营&#xff0c;助力企业扬帆起航。 一、微软必应bing…

远程监控供水设备运行状态

随着城市化进程的加快&#xff0c;供水设备的安全稳定运行对于保障居民日常生活和工业生产至关重要。然而&#xff0c;传统的供水设备管理方式往往受限于人力、物力和时间的限制&#xff0c;难以实现对供水设备运行状态的全面监控和实时管理。在这一背景下&#xff0c;HiWoo Cl…

海洋环境保护论文阅读记录

海洋环境保护 论文1&#xff1a;Critical role of wave–seabed interactions in the extensive erosion of Yellow River estuarine sediments 波浪-海床相互作用在黄河河口广泛侵中的关键作用 estuatine 河口的&#xff0c;港湾的 erodibility侵蚀度 sediment erodibility …

GEVernova推出GEV新能源平台,引领新能源未来

近日&#xff0c;全球领先的能源设备制造和服务公司 GE Vernova 宣布推出 GEV 新能源平台&#xff0c;这是一个将金融、科技和产业深度融合的全新投资平台。GEV 新能源平台旨在为用户提供一站式可持续新能源投资解决方案&#xff0c;助力全球新能源转型和可持续发展。 新能源已…

YOLOv9-20240507周更说明|更新MobileNetv4等多种轻量化主干

专栏地址&#xff1a;目前售价售价69.9&#xff0c;改进点70 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 本周已更新说明&#xff1a; ### ⭐⭐更新时间&#xff1a;2024/5/12⭐⭐ 1. YOLOv9…

【Web后端】web后端开发简介_Servlet简介

1.web后端开发简介 Java企业级开发&#xff0c;也就是学习]avaEE(Enterprise Edition)版本,是一种结构和一套标准。在应用中开发的标准就是Servlet、jsp和JavaBean技术。jsp技术现在已基本处于淘汰状态&#xff0c;简单了解即可web后端开发&#xff0c;基于B/S模式的开发体系。…

【ArcGIS Pro微课1000例】0058:玩转NetCDF多维数据集

一、NetCDF介绍 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。NetCDF广泛应…

从XML配置角度理解Spring AOP

1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为其主要机制来实现面向切面的编程。这种机制允许Spring在运行时动态地创建代理对象&#xff0c;这些代理对象包装了目标对象&#xff08;即业务组件&#xff09;&#xff0c;以便在调用目标对…

MySQL基础使用指南

难度就是价值所在。大家好&#xff0c;今天给大家分享一下关于MySQL的基础使用&#xff0c;MySQL 是一个流行的关系型数据库管理系统&#xff0c;被广泛应用于各种类型的应用程序开发中。本文中将介绍 MySQL 的基础使用方法&#xff0c;包括创建数据库、创建表格以及进行增删改…

污水设备远程监控

随着环保意识的日益增强&#xff0c;污水处理作为城市建设和环境保护的重要一环&#xff0c;越来越受到社会各界的关注。然而&#xff0c;传统的污水处理设备管理方式往往存在着效率低下、响应速度慢、维护成本高等问题。为了解决这些痛点&#xff0c;HiWoo Cloud平台凭借其强大…

【数据结构与算法 刷题系列】合并两个有序链表

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 目录 一、问题描述 二、解题思路详解 合并两个有序链表的思路 解题的步…

庙算兵棋推演AI开发初探(4-调用AI模型)

前面讲了如何开展编写规则脚本型Agent&#xff08;智能体&#xff09;的方法&#xff0c;现在探究一下如何调用知识型&#xff08;一般而言的训练出的模型&#xff09;智能体的方法。 这次调用的是庙算平台的demo&#xff08;网址见图&#xff09; 下载了“知识强化学习型”…

鸿蒙开发:【从TypeScript到ArkTS的适配规则】

从TypeScript到ArkTS的适配规则 ArkTS通过规范约束了TypeScript&#xff08;简称TS&#xff09;中过于灵活而影响开发正确性或者给运行时带来不必要额外开销的特性。本文罗列了所有在ArkTS中限制的TS特性&#xff0c;并提供了重构代码的建议。ArkTS保留了TS大部分的语法特性&a…