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

在这里插入图片描述

💗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;
        }
    }

}

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


在这里插入图片描述

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

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

相关文章

Kafka入门,漏消费和重复消费, 消费者事务,数据积压(二十四)

漏消费和重复消费 重复消费&#xff1a;已经消费了数据&#xff0c;但是offset没提交。 漏消费&#xff1a;先提交offset后消费&#xff0c;有可能会造成数据得漏消费 消费者事务 如果向完成consumer端得进准一次性消费&#xff0c;那么需要Kafka消费端将消费过程和提交offs…

【Accumulate】Gitee解决每次推送输入账户密码问题

【前言】 每次建立私人仓库后&#xff0c;一推送就得输入账户密码&#xff0c;真的巨烦人啊。 【解决】 step1&#xff1a; 绑定私匙&#xff1a; 配置Git_犟小孩的博客-CSDN博客 step2&#xff1a; 每次绑定远程仓库的时候&#xff0c;使用SSH绑定 如果已经绑定过了&…

YoloV2

时间线 Motivation Yolo-v1是在检测精度尚可的前提下达到了实时检测&#xff0c;同年的SSD检测速度略慢但检测精度远高于Yolo-v1&#xff0c;因此&#xff0c;Yolo-v2则是着眼于检测得更快更准&#xff0c;同时它利用WordTree创造性地将Imag…

回归预测 | MATLAB实现WOA-DBN鲸鱼算法优化深度置信网络的多输入回归预测

回归预测 | MATLAB实现WOA-DBN鲸鱼算法优化深度置信网络的多输入回归预测 目录 回归预测 | MATLAB实现WOA-DBN鲸鱼算法优化深度置信网络的多输入回归预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于鲸鱼算法优化深度置信网络(WOA-DBN)的数据回归预测&…

vim的使用方法及相关按键

目录 一、安装vim 二、vim的使用 1.打开vim 2.vim的四种模式使用 &#xff08;1&#xff09;命令模式&#xff08;快捷键的使用&#xff09; &#xff08;2&#xff09;编辑模式 &#xff08;3&#xff09;末行模式 &#xff08;4&#xff09;可视化模式 一、安装vim …

虹科方案 | Redis Enterprise:适用于任何企业的矢量数据库解决方案

用户希望他们遇到的每个应用程序和网站都具有搜索功能。然而&#xff0c;超过80%的业务数据是非结构化的&#xff0c;以文本、图像、音频、视频或其他格式存储。因此&#xff0c;我们需要一种跨非结构化数据的搜索方式。 什么是矢量数据库&#xff08;vector database&#xff…

基于深度学习的高精度老虎检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度老虎检测识别系统可用于日常生活中或野外来检测与定位老虎目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的老虎目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

uniapp学习之【uniapp的返回事件 onBackPress 在微信小程序中不生效的问题】

uniapp 的返回事件 onBackPress 在微信小程序中不生效的问题 场景&#xff1a;页面中点击左上角的返回按钮,监听返回操作,页面返回前执行了一些操作, uniapp 页面生命周期中有 onBackPress ,因此将操作写在了 onBackPress () 页面生命周期钩子当中, H5 测试一切正常,但是微信开…

集合面试题--LinkedList数组

目录 单向链表 介绍 时间复杂度分析 双向链表 时间复杂度分析 总结 ArrayList和LinkedList的区别是什么&#xff1f; 单向链表 介绍 时间复杂度分析 双向链表 时间复杂度分析 总结 ArrayList和LinkedList的区别是什么&#xff1f;

某网站JS加密、OB混淆与CSS反爬实战分析

1. 写在前面 最近一段时间接触了一些小说网站的业务。发现很多的小说网站&#xff0c;甚至一些小站它们的安全防护措施做的都很到位&#xff01;例如上次说到的的五秒盾也是存在于一个小说小站。今天要讲的这个网站它集JS加密、ob混淆、CSS反爬于一体 目标站点&#xff1a; aH…

【javaEE面试题(四)线程不安全的原因】【1. 修改共享数据 2. 操作不是原子性 3. 内存可见性 4. 代码顺序性】

4. 多线程带来的的风险-线程安全 (重点) 4.1 观察线程不安全 static class Counter {public int count 0;void increase() {count;} } public static void main(String[] args) throws InterruptedException {final Counter counter new Counter();Thread t1 new Thread(()…

王道考研计算机网络第五章知识点汇总

5.1.1 传输层概述 复用&#xff1a;好比家里面每个人都要写信&#xff0c;向信箱里面投入信件&#xff0c;然后由邮递员取走。 分用&#xff1a;就是每个人都收到了各自的回信&#xff0c;然后从信箱中取走各自的信 5.2 UDP协议 注意&#xff1a;用户数据报和检验和都是指的整…

深度剖析线上应用节点流量隔离技术

作者&#xff1a;谢文欣&#xff08;风敬&#xff09; 为什么要做流量隔离 源于一个 EDAS 客户遇到的棘手情况&#xff1a;他们线上的一个 Pod CPU 指标异常&#xff0c;为了进一步诊断问题&#xff0c;客户希望在不重建此 Pod 的情况下保留现场&#xff0c;但诊断期间流量还…

chatGPT如何开启 Browsing 功能,实现即时联网查询?

Openai 为每一个 chatGPT Plus 用户都开放了 Browsing 和 plugins 功能。 前者可以在 ChatGPT 觉得有必要的时候&#xff08;比如你问它今天的新闻&#xff09;&#xff0c;自动联网查询&#xff0c;后者是第三方开发者开发的插件&#xff0c;数量繁多&#xff0c;可以解决各种…

【Distributed】分布式ELK日志文件分析系统

文章目录 一、ELK 概述1. 为什么要使用 ELK2. 完整日志系统基本特征3. ELK 简介3.1 ElasticSearch&#xff08;ES&#xff09;3.2 Kiabana3.3 Logstash3.4 其它组件Filebeat缓存/消息队列Fluentd 4. ELK 的工作原理5. Linux 系统内核日志消息的优先级别 二、 部署 ELK 集群服务…

使用python调用ChatGPT API 简单示例

如果你已经获得了OpenAI的API密钥&#xff0c;并且想要使用Python发起ChatGPT对话&#xff0c;你可以使用OpenAI的Python SDK来实现。下面是一个简单的示例代码&#xff1a; 首先&#xff0c;你需要确保已安装OpenAI的Python SDK。你可以使用pip来安装&#xff1a; pip insta…

BaGet做了一个Nuget私有服务器,Nginx代理之后还是会请求被代理得地址

Nuget搭建和使用可以参考官网得文档 https://loic-sharma.github.io/BaGet/installation/docker/ 这是我用Nginx代理之后出现得问题&#xff0c;观察请求url和响应回来得配置。配置中得ip地址得url是我被代理得下游地址&#xff0c;所以是无法访问的。 我原本以为是要去server…

【案例教程】GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践实践技术

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

79. 单词搜索

79. 单词搜索 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 79. 单词搜索 https://leetcode.cn/problems/word-search/ 完成情况&#xff1a; 解题思路&#xff1a; 参考代码&#xff1a; package 西湖算法题…

微信小程序使用animation.css

animation.css是一款纯css动画库&#xff0c;其中提供了丰富的动画效果 我们直接下载animation.css&#xff0c;即可使用其中的样式 其官网为&#xff1a;Animate.css | A cross-browser library of CSS animations. 1.下载 使用npm下载animation.css&#xff1a; npm inst…