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")
    @ResponseBody
    public 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: 7080
    context-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{

    @Override
    public 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 {
    @Override
    public 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"})
    @Bean
    public 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>
   // 获得token
    private 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;
    }


    // 验证token
    private 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返回的时候不希望显示出来,可用此注解
 @JsonIgnore
 private 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")
    @ResponseBody
    public 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring的IOC和AOP机制?

我们是在使用Spring框架的过程中&#xff0c;其实就是为了使用IOC&#xff0c;依赖注入&#xff0c;和AOP&#xff0c;面向切面编程&#xff0c;这两个是Spring的灵魂。 主要用到的设计模式有工厂模式和代理模式。 IOC就是典型的工厂模式&#xff0c;通过sessionfactory去注入…

能效?性能?一个关于Windows下使用openssl speed进行速度测试的诡异问题

问题描述 最近的某个软件用到了openssl&#xff0c;所以就想着测试一下速度。我的电脑是惠普的&#xff0c;CPU是AMD Ryzen 7 PRO 6850HS&#xff0c;系统是Win11。我使用openssl自带的speed测试加密/解密的速度&#xff0c;命令大致如下&#xff1a; openssl speed -evp aes…

【卫星影像三维重建-全流程代码实现】点云Mesh重构

点云—>Mesh模型 1.介绍1.1 背景1.2 效果示意 2 算法实现2.1 依赖库2.2 实验数据2.3 代码实现2.4 实验效果 3.总结 1.介绍 1.1 背景 &#xff08;1&#xff09;本文主要内容是将三维点云&#xff08;离散的三维点&#xff09;进行表面重建生成Mesh网格&#xff0c;之前有篇…

Day27

回溯算法part01 回溯算法 回溯算法的本质&#xff1a;本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案 更高效的回溯算法&#xff1a;加入剪枝操作 回溯算法可以解决的问题类型 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&…

VRRP协议-负载分担配置【分别在路由器与交换机上配置】

VRRP在路由器与交换机上的不同配置 一、使用路由器实现负载分担二、使用交换机实现负载分担一、使用路由器实现负载分担 使用R1与R2两台设备分别进行VRRP备份组 VRRP备份组1,虚拟pc1的网关地址10.1.1.254 VRRP备份组2,虚拟pc2的网关地址10.1.1.253 ①备份组1的vrid=1,vrip=…

叉车AGV销量19.5万台,订单暴增46%,这10家公司展开激烈厮杀~

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 在2023年的中国&#xff0c;无人叉车市场迎来了爆炸性的增长。根据CMR产业联盟和新战略移动机器人产业研究所的统计&#xff0c;全年销量达到了惊…

java 使用hh或者HH异常

故障描述 使用了HH或者hh使用时间format、DatetimeFormat注解时序列化失败 故障原因 当使用hh的时候&#xff0c;小时只能是1-24 使用KK的时候&#xff0c;小时只能是0-23 比如&#xff1a;凌晨0:30&#xff0c;使用hh就是0:30 am&#xff0c; kk就是12:30 24小时制的话,使…

PyQt:界面无边框+实现窗口最小化(任务栏图标隐藏+托盘图标显示)

一、整体实现效果 诸如WX、各种管家的桌面显示方式。窗口关闭后&#xff0c;往往是任务栏图标消失&#xff0c;保持右下角托盘图标显示&#xff0c;保持后台运行。双击托盘图标后&#xff0c;窗口显示。 二、代码实现 from PyQt5.QtWidgets import * from ato_upgrade impo…

Backend - 数据分析 Pandas

目录 一、作用 二、基础环境 &#xff08;一&#xff09;执行虚拟环境的终端命令 &#xff08;二&#xff09;代码中导包 三、应用&#xff1a;一维数组 &#xff08;一&#xff09;Series对象 1. 含义 2. 常用属性和方法 &#xff08;1&#xff09;属性 &#xff08;…

【精读Yamamoto】方向性连接如何丰富神经网络的功能复杂度 | 体外神经元培养实验 | 脉冲神经元模型(SNN) | 状态转移模型

探索大脑的微观世界&#xff1a;方向性连接如何丰富神经网络的功能复杂度 在神经科学领域&#xff0c;理解大脑如何通过其复杂的网络结构实现高级功能一直是一个核心议题。最近&#xff0c;一项由Nobuaki Monma和Hideaki Yamamoto博士领导的研究为我们提供了新的视角&#xff…

【java-数据结构-栈和队列】

上篇文章&#xff0c;我们已经完成链表的收尾工作&#xff0c;从本篇文章开始&#xff0c;将进入栈和队列的学习&#xff0c;j觉得小编写的还可以的可以留个关注支持一下~话不多说&#xff0c;上正文~ 1.栈 概念&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端…

信创应用软件之协同办公(OA)

信创应用软件之协同办公&#xff08;OA&#xff09; 概述 办公 “办公”一词源于历史上对公事、公务处理的简称&#xff0c;现代办公有了更先进的诠释&#xff0c;指在特定时间、特定空间中人互相协作、共同运作的过程&#xff0c; 即围绕以“人”为主的办公主体与其关联的一…

zabbix监控mariadb

zabbix 服务端安装请参阅&#xff1a;红帽 9 zabbix 安装流程_红帽安装zabbix-CSDN博客 源码包安装mariadb请参阅&#xff1a;源码包安装mariadb_mariadb 11 源码编译安装-CSDN博客 在MariaDB中&#xff0c;你需要创建一个专门的用户&#xff0c;用于Zabbix进行监控。这个用户…

百度云内容审核

百度云内容审核介绍 百度智能云内容审核平台&#xff1a;是一款针对多媒体内容进行智能审核的服务平台。支持对图像、文本、音频、视频、直播等内容进行安全审核&#xff0c;具有精准的审核模型、丰富的审核维度、灵活的规则配置等特点。通过可视化界面选择审核维度、个性化调整…

疯狂学英语

我上本科的时候&#xff0c;学校出国留学的气氛不浓厚&#xff0c;我们班只有一名同学有出国留学的倾向&#xff0c;我们宿舍八个人没有一个考虑过留学。 只有小昊&#xff0c;在本校上了研究生之后&#xff0c;不知道受到什么影响&#xff0c;想出国留学。那时候小昊利用一切…

单文件EXE绿色软件制作工具​Enigma Virtual Box​利用 EnigmaVB 打包 Qt 应用程序

功能描述&#xff1a;详细介绍如何利用 EnigmaVB 打包 Qt 应用程序&#xff0c;从 EnigmaVB 软件下载、安装&#xff0c;到如何使用&#xff0c;一步步教你走进 EnigmaVB 软件&#xff0c;最后还介绍了一款针对 Enigma Virtual Box 制作的单文件程序进行解包的工具 EnigmaVBUnp…

【启明智显技术分享】SSD201/SSD202D核心板UI界面开发全攻略:LVGL使用指南

提示&#xff1a;作为Espressif&#xff08;乐鑫科技&#xff09;大中华区合作伙伴及sigmastar&#xff08;厦门星宸&#xff09;VAD合作伙伴&#xff0c;我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸…

数字化信息协同助力智能巡查,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建无人机数字侦查场景下智能靶标检测识别系统

无人机的快速发展与普及&#xff0c;使得其进入千家万户各行各业&#xff0c;发挥着越来越重要的作用。随着科技的飞速发展&#xff0c;未来的数字信息化战场正逐渐展现出其独特的作战形态。在这个以数据和信息为主导的新战场上&#xff0c;无人机侦查手段与人工智能目标智能检…

Django图书馆综合项目-学习

图书馆项目 一 前期准备 安装好所需的环境 我这边用的IDE是VScode 操作系统是MACOS 二 先创建一个虚拟环境 python3 -m venv myenvbook source myenvbook/bin/activate 三 安装 Django pip3 install django4.2 四 创建 Django 项目 django-admin startproject bookp…

二叉树的前序、中序、后序遍历

二叉树的前序、中序、后序 1.二叉树的前序遍历 题目&#xff1a; 二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff…