Spring Boot原理分析 | SpringApplication、Yaml、Properties

news2024/12/23 23:06:31

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


Spring Boot

Spring开源框架,轻量级的Java开发框架,解决企业级应用开发的复杂性而创建,简化开发

  • 基于POJO的轻量级和最小侵入型编程
  • 通过IOC,依赖注入(DI)和面向接口实现松耦合
  • 基于切面(AOP)和惯例进行声明式编程
  • 通过切面和模板减少样式代码

微服务架构

微服务架构是"新常态":构建小型、独立、随时可以运行的应用程序可以为您的代码带来极大的灵活性和更大的弹性;Spring Boot 的许多专用功能使您可以轻松地在生产环境中大规模构建和运行微服务;微服务是一种现代软件方法,其中应用程序代码以小的、可管理的片段交付,独立于其他部分

自动装配

pom.xml

  • spring-boot-dependencies:核心依赖(导入springboot依赖时,不需要指定版本)

启动器

  • spring-boot-starter-……:启动器(自动导入web环境所有依赖)

主程序

  • @SpringBootApplication:标注这个类是springboot应用
  • SpringApplication.run(Springboot01HelloworldApplication.class, args):将springboot应用启动

注解

  • @Target
@Target用来表示注解作用范围,超过这个作用范围,编译的时候就会报错
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包,用于记录java文件的package信息
  • @Retention
@Retention是用来修饰注解的,注解的注解,也称为元注解
source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略
class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
  • @Documented

指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值

  • @Inherited

标注一个父类的注解是否可以被子类继承,如果一个注解需要被其子类所继承,则在声明时直接使用@Inherited注解即可;如果没有写此注解,则无法被子类继承

  • @SpringBootConfiguration:springboot的配置
    • @Configuration:spring配置类
    • @Component:spring组件(定义Spring管理Bean,标注@Component注解的类交由spring管理)
  • @EnableAutoConfiguration:自动配置
    • @AutoConfigurationPackage:自动配置包
    • @Import({AutoConfigurationImportSelector.class}):导入选择器

流程:

  • SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
  • 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 进行自动配置工作
  • 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包
  • 容器中导入自动配置类 (xxxAutoConfiguration), 给容器中导入场景需要的所有组件 , 并配置组件
  • 有了自动配置类 , 避免手动编写配置注入功能组件的工作

SpringApplication

  • 推断应用的类型是普通的项目还是Web项目
  • 查找并加载所有可用初始化器 , 设置到initializers属性中
  • 找出所有的应用程序监听器,设置到listeners属性中
  • 推断并设置main方法的定义类,找到运行的主类

Yaml语法

YAML是一个可读性高,用来表达数据序列化的格式;YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的

  • application.properties
    • 语法结构 :key=value
  • application.yml
    • 语法结构 :key:空格 value

配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了

  • XML
<server>
    <port>8081<port>
</server>
  • Yaml
server:
  prot: 8080

@ConfigurationProperties作用

  • 将配置文件中配置的每一个属性的值,映射到这个组件中
  • 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
  • 参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应

@Component

注册bean

<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

Yaml和Properties语法

Yaml

  • 配置文件配置和Yaml文件绑定
@ConfigurationProperties(prefix = "person")
  • Yaml文件
Person:
  name: weishuo
  age: 18
  happy: false
  birth: 2002/10/21
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - music
    - girl
  dog:
    name: 旺财
    age: 3

Properties

  • 加载指定的配置文件
@PropertySource(value = "classpath:application.properties")
  • Properties文件
name=weishuo
age=18

在这里插入图片描述

多环境配置

  • application.yaml
server:
  port: 8080
spring:
  profiles:
    active: dev

---

server:
  port: 8082
spring:
  profiles: dev
  
---

server:
  port: 8083
spring:
  profiles: test

首页图标

  • 将ico图片放在resources目录下的static目录中
  • index.html加入link元素
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <link rel="icon" href="1.ico">
</head>
<body>
<h1>首页</h1>
</body>
</html>

Thymeleaf

Thymeleaf是一款流行的Java模板引擎,它提供了一种自然的、HTML标签友好的模板语言,旨在让模板的阅读和编辑更加直观和容易;Thymeleaf可以用于构建Web应用程序,特别是与Spring框架的Spring MVC模块一起使用时,它可以将动态内容渲染到HTML页面中,并处理表单绑定、国际化等常见的Web开发需求

  • HTML标签友好:Thymeleaf使用HTML5兼容的模板语法,模板文件看起来和普通的HTML文件非常相似,易于理解和编辑
  • 支持Spring框架:Thymeleaf与Spring框架无缝集成,支持Spring MVC模块的表单绑定、国际化、安全性等特性
  • 支持静态和动态内容:Thymeleaf可以在HTML文件中包含静态和动态的内容,支持标准的表达式、条件语句、循环语句等常见的编程元素
  • 支持多种模板解析器:Thymeleaf支持多种模板解析器,包括XML、HTML、文本等,满足不同场景下的需求
  • 易于学习和使用:Thymeleaf的语法简单易懂,可以快速上手,而且有详细的官方文档和社区支持

自定义视图解析器

package com.wei.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Locale;


@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    //将视图解析器MyViewResolver注入Bean
    @Bean
    public ViewResolver myViewResolver(){
        return new MyViewResolver();
    }

    //自定义视图解析器MyViewResolver
    public static class MyViewResolver implements ViewResolver{
        @Override
        public View resolveViewName(String viewName, Locale locale) throws Exception {
            return null;
        }
    }

}

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

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

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

相关文章

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(6月 30 日论文合集)

文章目录 一、分割|语义相关(8篇)1.1 MIS-FM: 3D Medical Image Segmentation using Foundation Models Pretrained on a Large-Scale Unannotated Dataset1.2 KITE: Keypoint-Conditioned Policies for Semantic Manipulation1.3 SeMLaPS: Real-time Semantic Mapping with La…

labelme的json标签和图像改变分辨率,再将json转换为YOLO的txt格式进行实例分割

最近在做一个分割数据集&#xff0c;训练数据时由于图像数据太大一直爆显存&#xff0c;然后就找了找同时resize图像和json的脚本&#xff0c;然后转换为YOLO格式一直出问题&#xff0c;标签和目标位置对不上&#xff0c;也是困扰了好久&#xff0c;终于解决&#xff0c;记录一…

惠普笔记本U盘重装Win10系统步骤

当惠普笔记本出现系统故障或需要清除所有数据时&#xff0c;通过使用U盘重新安装Win10系统是一个常见且有效的解决方法。重新安装系统可以解决许多问题&#xff0c;并为用户提供一个干净、流畅的操作环境。以下小编将为用户介绍惠普笔记本U盘重装Win10系统步骤。请注意&#xf…

手把手教学,Python 游戏编程之实现飞机大战(含源代码)

文章目录 一、游戏设定 1、游戏界面展示和设定 二、实现过程 1.我方飞机 2、敌方飞机 3、定义武器 4、武器补充库 5、主模块 总结&#xff1a; 前言 我想大家都是有玩过类似飞机大战的射击类游戏&#xff0c;也享受目标被消除通过后带来的愉悦感。 那么如果用Python来实现飞机…

Image Sensor的窗口裁剪

本文介绍Image Sensor的窗口裁剪&#xff0c;Image Sensor的实际像素通常是大于实际所支持的最大分辨率的&#xff0c;有时为了获得想要的分辨率及位置&#xff08;比如与镜头装配相匹配&#xff09;&#xff0c;需要设置Image Sensor的像素输出位置及大小&#xff0c;本文以OS…

为什么向导式对话框中的取消按钮始终可用

PropSheet_SetWizButtons 是一个宏&#xff0c;其定义位于 PRSHT.H 头文件中&#xff0c;实际上&#xff0c;它只是调用了 PostMessage 函数来向目标窗口发送 PSM_SETWIZBUTTONS 这个消息&#xff0c;仅此而已。 如果你亲自上阵体验一番&#xff0c;就会发现有这么一个问题(特…

c++ stl 之vector使用

参考&#xff1a;https://www.runoob.com/cplusplus/cpp-stl-tutorial.html “C STL&#xff08;标准模板库&#xff09;是一套功能强大的 C 模板类&#xff0c;提供了通用的模板类和函数&#xff0c;这些模板类和函数可以实现多种流行和常用的算法和数据结构&#xff0c;如向…

特征向量可视化01_tsne_pca

在学习机器学习或深度学习基础知识的同时训练模型是一个非常有指导性的过程。该数据集易于理解且格式适当&#xff0c;可供您使用。然而&#xff0c;当您走进现实世界并尝试解决行业或现实生活中的挑战时&#xff0c;数据集如果一开始就不存在&#xff0c;通常会很混乱。理解为…

uniapp怎么把px转换成对应手机型号的rpx

首先获取系统手机屏幕的宽度系统信息的概念 | uni-app官网&#xff0c;然后根据公式转换 rpx 750*元素 B 在设计稿上的宽度为 多少px/手机屏幕的宽度 详见&#xff1a;CSS 支持 | uni-app官网 如下为把宽度为1px的转成对应手机型号的rpx uni.getSystemInfo({success(res) {co…

网络营销VS传统营销有什么区别?

随着互联网的普及和发展&#xff0c;网络营销已经成为企业营销的重要手段之一。相比传统营销&#xff0c;网络营销具有更多的优势和特点。本文将从市场环境、营销手段、成本效益等方面&#xff0c;分析网络营销与传统营销的区别。#网络营销# 一、市场环境不同 传统营销主要是通…

华为OD机试真题 Python 实现【查找单入口空闲区域】【2022 Q4 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 给定一个 m x n 的矩阵&#xff0c;由若干字符 ‘X’ 和 ‘O’构成&#xff0c;’X’表示该处已被占据&#xff0c;’O’表示该处空闲&#xff0c;请…

[pyqt5]动态加载ui文件并给菜单的一个子菜单添加触发事件

场景&#xff1a;大家都知道如果直接将ui文件转成py文件后&#xff0c;如果产品经理要你加一些界面控件&#xff0c;你就得改转换后代码这样很麻烦&#xff0c;我们可以直接加载ui文件&#xff0c;然后编写触发事件&#xff0c;因此写了一个简单案例&#xff0c;证明切实可行&a…

微服务:Springboot集成Hystrix实现熔断、降级、隔离

文章目录 前言知识积累Springboot集成Hystrix1、maven依赖引入2、application开启feign的hystrix支持&#xff08;客户端配置限流降级熔断&#xff09;3、入口类增加EnableFeignClients EnableHystrix 开启feign与hystrix4、feign调用增加降级方法服务端配置限流降级熔断(选择使…

stm32 使用keil无实物(软件)仿真,虚拟串口通讯

准备 1.keil 2.vspd虚拟串口 3.sscom串口助手 4.CubeMX //哪里报错no ‘read‘ permission&#xff0c;把哪里map一下 map 0x40000000, 0x400077FF read write // APB1 map 0x40010000, 0x40014BFF read write // APB2 map 0x40020000, 0x4007FFFF read write …

​​国风写实虚拟人频“营业”,塑造国潮文化元宇宙入口

近几年&#xff0c;随着时代话语权逐渐递交给Z世代的年轻人&#xff0c;文化自信成为了主流审美&#xff0c;国风虚拟人激发了年轻人心中的民族文化自豪感。 国风虚拟人谷小雨频营业&#xff0c;发布了“中文之美”虚拟人动画&#xff0c;穿越古今四时感受“雨”字流转之美&am…

MMdetection框架速成系列 第04部分:配置文件详细解析+文件结构剖析+Config类核心实现

&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697;&#x1f697; MMdetection框架速成系列 MMdetect…

简单回顾一下kafka的学习

简单回顾一下kafka的学习 WhatBrokerControllerPartitionReplicationTopicProducerConsumer Why为什么有多个分区为什么有副本 How搭建集群Java简单使用ProducerConsumeroffset提交方式自动提交 - 默认手动提交 消费者poll消息的过程指定分区消费消息回溯消费指定offset消费新消…

Firefly

Firefly(流萤): 中文对话式大语言模型在本文中&#xff0c;笔者将介绍关于Firefly&#xff08;流萤&#xff09;模型的工作&#xff0c;一个中文对话式大语言模型。https://mp.weixin.qq.com/s/TX7wj8IzD_EaMTvk0bjRtA一个支持中文的176B开源基础模型BLOOM&#xff1a;从数据源…

git merge 和git rebase的区别

文章目录 1. 概念2. git merge2.1. 示例 3. git rebase3.1. 示例 4. 总结 1. 概念 在Git版本控制系统中&#xff0c;有两种方式可以将一个分支的更改合并到另一个分支&#xff1a;git merge 和 git rebase。虽然它们都可以完成相同的任务&#xff0c;但它们的实现方式有所不同…

faster-rcnn.pytorch项目环境配置(从0到1)

faster-rcnn.pytorch项目环境配置&#xff08;从0到1&#xff09; 其实pytorch版本和CUDA版本高&#xff0c;都没有关系&#xff01;&#xff01;&#xff01;都可以适配&#xff0c;显卡30系、20系都没关系&#xff0c;都可以用&#xff01; 下面我将在AutoDL平台上&#xf…