springboot学习整理

news2024/11/24 5:03:17

视频:基础篇-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

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

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

相关文章

【LangChain学习之旅】—(21)聊天客服机器人的开发(上)

【LangChain学习之旅】—(21)聊天客服机器人的开发(上) “聊天机器人”说明项目的技术实现细节技术实现步骤简述第二步:增加记忆机制第三步:增加检索机制总结“聊天机器人”说明 聊天机器人(Chatbot)是 LLM 和 LangChain 的核心用例之一,很多人学习大语言模型,学习 …

Jmeter(三十九) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 上篇(详解教程)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了&#xff0c;因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂&#xff0c;就算修改了也是…

今天开发了一款软件,我竟然只用敲了一个字母(文末揭晓)

软件课题&#xff1a;Python实现打印100内数学试题软件及开发过程 一、需求管理&#xff1a; 1.实现语言&#xff1a;Python 2.打印纸张&#xff1a;A4 3.铺满整张纸 4.打包成exe 先看效果&#xff1a; 1. 2.电脑打印预览 3.打印到A4纸效果&#xff08;晚上拍的&#x…

R语言手把手教你进行支持向量机分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知…

云粒智慧实时数仓的架构演进分享:OceanBase + Flink CDC

4月20日&#xff0c;在2024 OceanBase开发者大会上&#xff0c;云粒智慧的高级技术专家付大伟&#xff0c;分享了云粒智慧实时数仓的构建历程。他讲述了如何在传统数仓技术框架下的相关努力后&#xff0c;选择了OceanBase Flink CDC架构的实时数仓演进历程。 业务背景及挑战 …

企业数据治理过程有哪些挑战?该如何克服?

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。随着大数据、云计算和人工智能等技术的兴起&#xff0c;企业积累的数据量呈指数级增长。这些数据中蕴含着巨大的商业价值&#xff0c;对于推动企业发展、优化决策制定、增强市场竞争力具有不可替代的作用。然而&#…

Python-VBA函数之旅-type函数

目录 一、type函数的常见应用场景 二、type函数使用注意事项 三、如何用好type函数&#xff1f; 1、type函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、type函…

企业微信hook接口协议,ipad协议http,获取群成员列表简洁版

获取群成员列表简洁版 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","roomid":10696052955016166 } 返回示例 {"data": {&q…

政安晨:【Keras机器学习示例演绎】(四十四)—— 使用序列到序列转换器实现英语到西班牙语的翻译

目录 简介 设置 下载数据 解析数据 文本数据矢量化 建立模型 训练我们的模型 解码测试句子 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之…

智慧管家物业管理系统(小组项目)

目录 前言 一、项目介绍 1、目的和背景 2、项目主要内容 3、技术介绍 二、功能模块 1、重要文件结构 2、功能实现&#xff08;部分个人负责模块功能&#xff09; 2.1 展示房源信息页面 2.2 房屋详情页面 2.3 房源信息管理 三、功能模块页面 1、前台模块 2、后台…

使用vue3+ts+vite从零开始搭建bolg(五):layout(持续更新中)

五、layout搭建 5.1静态搭建 在src下创建如图文件夹 这里用logo举例&#xff0c;在scripts里export <script lang"ts">export default {name: Logo,}</script> 然后在layout里引入 //引入左侧菜单顶部用户信息 import Logo from ./logo/index.vue 接…

M-有效算法

在赛场上&#xff0c;脑子就两个字“二分”&#xff0c;一点思路都没&#xff0c;完全不知道二分谁&#xff0c;怎么二分&#xff0c;从哪入手。隐隐约约也知道要变换公式&#xff0c;可惜没坚持这个想法。脑子里全是把k分离出来&#xff0c;赛后看了题解才知道&#xff0c;应该…

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

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

【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】

请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器&#xff08;ICSR&#xff09;Debug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障…

【MQTT】paho.mqtt.cpp 库的 介绍、下载、交叉编译、MQTT客户端例子源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-05-13 1…

盘他系列——oj!!!

1.Openjudge 网站: OpenJudge 2.洛谷 网站: 首页 - 洛谷 | 计算机科学教育新生态 3.环球OJ 网站: QOJ - QOJ.ac 4. 北京大学 OJ:Welcome To PKU JudgeOnline 5.自由OJ 网站: https://loj.ac/ 6.炼码 网站:LintCode 炼码 8.力扣 网站: 力扣 9.晴练网首页 - 晴练网

安科瑞AIM-D100-ES光伏储能系统直流绝缘监测仪

概述 AIM-D100-ES 型直流绝缘监测仪主要用于在线监测直流不接地系统正负极对地绝缘电阻&#xff0c;当绝缘电阻低于设定值时&#xff0c;能发出预警和报警信号。 产品可测 100-1500V 的直流系统&#xff0c;可应用于储能直流系统、电动汽车充电装置、UPS 供电系统、光伏直流系…

第十一届蓝桥杯大赛软件类决赛 Java C 组

文章目录 发现宝藏【考生须知】试题 A: 美丽的 2试题 B: 合数个数试题 C: 扩散试题 D: 阶乘约数试题 E: 本质上升序列试题 F 天干地支试题 G 皮亚诺曲线距离试题 H 蓝肽子序列试题 I: 画廊试题 J 答疑 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&a…

本地运行《使用AMD上的SentenceTransformers构建语义搜索》

Building semantic search with SentenceTransformers on AMD — ROCm Blogs 这篇博客解释了如何在Sentence Compression数据集上训练SentenceTransformers模型来执行语义搜索。使用BERT基础模型&#xff08;不区分大小写&#xff09;作为基础的变换器&#xff0c;并应用Huggi…

家居分类的添加、修改、逻辑删除和批量删除

文章目录 1.逻辑删除家居分类1.将之前的docker数据库换成云数据库2.树形控件增加添加和删除按钮1.找到控件2.粘贴四个属性到<el-tree 属性>3.粘贴两个span到<el-tree>标签里4.代码5.效果6.方法区新增两个方法处理添加和删除分类7.输出查看一下信息8.要求节点等级小…