SpringBoot【原理分析、YAML文件、SpringBoot注册web组件】(二)-全面详解(学习总结---从入门到深化)

 

目录

 SpringBoot原理分析_核心注解

YAML文件_配置文件介绍 

YAML文件_自定义配置简单数据

 YAML文件_自定义配置对象数据

 YAML文件_自定义配置集合数据

YAML文件_读取配置文件的数据

使用@ConfigurationProperties读取

YAML文件_占位符的使用

YAML文件_配置文件存放位置及优先级

YAML文件_bootstrap配置文件

SpringBoot注册web组件_注册Servlet 

 SpringBoot注册web组件_注册Filter

SpringBoot注册web组件_注册Listener


 

 SpringBoot原理分析_核心注解

 @SpringBootApplication

标注是SpringBoot的启动类。 此注解等同于

@SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan 。

 @SpringBootConfiguration

@SpringBootConfiguration 是 @Configuration 的派生注解,跟 @Configuration 功能一 致,标注这个类是一个配置类,只不过 @SpringBootConfiguration 是 Springboot的注解,而 @Configuration 是Spring的注解

 @EnableAutoConfiguration

SpringBoot自动配置注解。 等同于

@AutoConfigurationPackage + @Import(AutoConfigurationImportSelector.class)

 @AutoConfigurationPackage

自动扫描包的注解,它会自动扫描主类所在包下所有加了注解的类 (@Controller,@Service等),以及配置类 (@Configuration)。

@Import({AutoConfigurationImportSelector.class})

该注解会导入 AutoConfifigurationImportSelector 类对象,该对象会从 META-INF/spring.factories 文件中读取配置类的名称列表。 

@ComponentScan

该注解会扫描项目,自动装配一些项目启动需要的Bean。 

YAML文件_配置文件介绍 

 SpringBoot项目中,大部分配置都有默认值,但如果想替换默认配 置的话,就可以使用application.properties或者application.yml进 行配置。

SpringBoot默认会从resources目录下加载application.properties 或application.yml文件。其中,application.properties文件是键值 对类型的文件,之前一直在使用,所以我们不再对properties文件 进行阐述。

 https://docs.spring.io/spring-boot/docs/2.7.0-M1/reference/ htmlsingle/#application-properties.server可以查找配置文件 如何覆盖SpringBoot项目的默认配置。

 除了properties文件外,SpringBoot还支持YAML文件进行配置。 YAML文件的扩展名为 .yml 或 .yaml ,它的基本要求如下:

1 大小写敏感

2 使用缩进代表层级关系

3 相同的部分只出现一次

比如使用properties文件配置tomcat端口:  server.port=8888

而使用YAML文件配置tomcat端口: 

server:
 port: 8888

YAML文件_自定义配置简单数据

 除了覆盖默认配置,我们还可以在YAML文件中配置其他信息以便我 们在项目中使用。配置简单数据的方式如下:

 语法:

       数据名: 值

示例代码:

      name: baizhan

注意:value之前有一个空格

 YAML文件_自定义配置对象数据

 对象:

      属性名1: 属性值

      属性名2: 属性值

# 或者

对象: {属性名1: 属性值,属性名2: 属性值}

 示例代码:

# 学生1
student1:
 sex: female
 age: 10
 address: beijing


# 学生2
student2: {sex: female,age: 10,address: beijing}

 属性名前面的空格个数不限,在yml语法中,相同缩进代表同一 个级别,只要每个属性前的空格数一样即可。

 YAML文件_自定义配置集合数据

 语法

集合:

       - 值1

       - 值2

# 或者

集合: [值1,值2]

 示例代码

# 城市
city1:
 - beijing
 - tianjin
 - shanghai
 - chongqing


city2:
[beijing,tianjin,shanghai,chongqing]


# 集合中的元素是对象
students:
 - name: xiaotong
   age: 18
   score: 100
 - name: shangxuetang
   age: 28
   score: 88
 - name: chengxuyuan
   age: 38
   score: 90

注意:值与之前的 - 之间存在一个空格

 

YAML文件_读取配置文件的数据

使用@Value读取

 我们可以通过@Value注解将配置文件中的值映射到一个Spring管理 的Bean的字段上,用法如下:

 配置文件

name: baizhan


student:
 sex: female
 age: 10
 address: beijing


city1:
 - beijing
 - tianjin
 - shanghai
 - chongqing

students:
 - name: xiaotong
   age: 18
   score: 100
 - name: shangxuetang
   age: 28
   score: 88
 - name: chengxuyuan
   age: 38
   score: 90

读取配置文件数据:

@Controller
public class YmlController1 {
    @Value("${name}")
    private String name;

    @Value("${student1.age}")
    private int age;

    @Value("${city1[0]}")
    private String city1;

    @Value("${students[0].score}")
    private double score1;

    @RequestMapping("/yml1")
    @ResponseBody
    public String yml1(){
        System.out.println(name);
        System.out.println(age);
        System.out.println(city1);
        System.out.println(score1);
        return "hello springboot!";
   }
}

@Value只能映射简单数据类型,不能将yaml文件中的对 象、集合映射到属性中。

 

使用@ConfigurationProperties读取

通过 @ConfigurationProperties(prefifix="对象") 可以将配置文件中的配置自动与实 体进行映射,这样可以将yml文件中配置的对象属性直接映射到 Bean当中。 

 配置文件

user:
 id: 10001
 username: shangxuetang
 address:
   - beijing
   - tianjin
   - shanghai
   - chongqing
 grades:
   - subject: math
     score: 100
   - subject: english
     score: 90

实体类

public class Grade {
    private String subject;
    private double score;
    // 省略getter/setter/tostring
}

读取配置文件

@Controller
@ConfigurationProperties(prefix = "user")
public class YmlController2 {
    private int id;
    private String username;
    private List<String> address;
    private List<Grade> grades;
    @RequestMapping("/yml2")
    @ResponseBody
    public String yml2(){
        System.out.println(id);
        System.out.println(username);
        System.out.println(address);
        System.out.println(grades);
        return "hello springboot!";
   }
    public int getId() {
        return id;
   }
    public void setId(int id) {
        this.id = id;
}
    public String getUsername() {
        return username;
   }
    public void setUsername(String username) {
        this.username = username;
   }
    public List<String> getAddress() {
        return address;
   }
    public void setAddress(List<String> address) {
        this.address = address;
   }
    public List<Grade> getGrades() {
        return grades;
   }
    public void setGrades(List<Grade> grades) {
        this.grades = grades;
   }
}

YAML文件_占位符的使用

 

 YAML文件中可以使用 ${} 占位符,它有两个作用:

 使用配置文件中的值

编写配置文件

server:
 port: 8888
myconfig:
 myport: ${server.port}

读取配置文件

@Controller
public class YmlController3 {
    @Value("${myconfig.myport}")
    private int port;
    @RequestMapping("/yml3")
    @ResponseBody
    public String yml3(){
        System.out.println(port);
        return "hello springboot!";
   }
}

使用框架提供的方法

SpringBoot框架提供了一些生成随机数的方法可以在yml文件中使 用:

 

 用法如下:

# 随机生成tomcat端口
server:
 port: ${random.int(1024,9999)}

YAML文件_配置文件存放位置及优先级

 配置文件有如下存放位置:

  1.  项目根目录下
  2.  项目根目录下的/config子目录中
  3.  项目的resources目录中
  4.  项目的resources下的/config子目录中

这些目录下都可以存放两类配置文件,分别是 application.yml 和 application.properties ,这些配置文件的优先级从高到低依次为:

 项目根目录下的/config子目录中

  •        config/application.properties
  •        config/application.yml

项目根目录下

  •       application.properties
  •       application.yml

项目的resources下的/config子目录中

  •      resources/config/application.properties
  •      resources/config/application.yml

项目的resources目录中

  •     resources/application.properties
  •     resources/application.yml

优先级高的文件会覆盖优先级低的文件中的配置

 

YAML文件_bootstrap配置文件

 SpringBoot中有两种容器对象,分别是bootstrap和application, bootstrap是应用程序的父容器,bootstrap加载优先于 applicaton。bootstrap配置文件主要对bootstrap容器进行配置, application配置文件是对applicaton容器进行配置。 bootstrap配置文件也同样支持properties和yml两种格式,主要用 于从外部引入Spring应用程序的配置。 bootstrap配置文件特征

  • boostrap由父ApplicationContext加载,比applicaton优先加载。
  • boostrap里面的属性不能被覆盖。

bootstrap与application的应用场景

  • application配置文件主要用于SpringBoot项目的自动化配 置。
  • bootstrap配置文件有以下几个应用场景。
  1. 使用Spring Cloud Config配置中心时,需要在bootstrap配置文件中添加连接到配置中 心的配置属性来加载外部配置中心的配置信息。
  2. 一些固定的不能被覆盖的属性。
  3. 一些加密/解密的场景。

SpringBoot注册web组件_注册Servlet 

 由于SpringBoot项目没有web.xml文件,所以无法在web.xml中注 册web组件,SpringBoot有自己的方式注册web组件。

 注册方式一

  • 编写servlet

@WebServlet("/first")
public class FirstServlet extends
HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("First Servlet........");
   }
}
  • 启动类扫描web组件
@SpringBootApplication
//SpringBoot启动时扫描注册注解标注的Web组件
@ServletComponentScan
public class Springbootdemo2Application {
    public static void main(String[] args)
       {
      
          SpringApplication.run(Springbootdemo2Application.class, args);
   }
}

 注册方式二 

  • 编写servlet

public class SecondServlet extends
HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("Second Servlet........");
   }
}
  • 使用配置类注册servlet

@Configuration
public class ServletConfig {
    //ServletRegistrationBean可以注册
      Servlet组件,将其放入Spring容器中即可注册Servlet
    @Bean
    public ServletRegistrationBean getServletRegistrationBean(){
        // 注册Servlet组件
        ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());
        // 添加Servlet组件访问路径
        bean.addUrlMappings("/second");
        return bean;
   }
}

 SpringBoot注册web组件_注册Filter

 注册方式一

  •  编写filter

@WebFilter(urlPatterns = "/first")
public class FirstFilter implements Filter
{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进入First Filter");
      
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("离开First Filter");
   }
    @Override
    public void destroy() { }
}
  • 启动类扫描web组件
@SpringBootApplication
//SpringBoot启动时扫描注册注解标注的Web组件
@ServletComponentScan
public class Springbootdemo2Application {
    public static void main(String[] args)
  {
      
      SpringApplication.run(Springbootdemo2Appl ication.class, args);
   }
}

 注册方式二

  • 编写filter

public class SecondFilter implements
Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进入Second Filter");
      
    filterChain.doFilter(servletRequest,servletResponse);

    System.out.println("离开Second Filter");
   }
    @Override
    public void destroy() { }
}
  • 使用配置类注册filter

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean getFilterRegistrationBean(){
        // 注册filter组件
        FilterRegistrationBean bean =  new FilterRegistrationBean(new SecondFilter());
        // 添加过滤路径
        bean.addUrlPatterns("/second");
        return bean;
   }
}

SpringBoot注册web组件_注册Listener

 注册方式一 

  •        编写Listener
@WebListener
public class FirstListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("First ListenerInit......");
   }
    @Override
    public void contextDestroyed(ServletContextEvent sce){
   }
}

启动类扫描web组件

@SpringBootApplication
//SpringBoot启动时扫描注册注解标注的Web组件
@ServletComponentScan
public class Springbootdemo2Application {
    public static void main(String[] args){       
      SpringApplication.run(Springbootdemo2Appl ication.class, args);
   }
}

注册方式二

  •  编写Listener
public class SecondListener implements
ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Second Listener Init......");
   }
    @Override
    public void contextDestroyed(ServletContextEvent sce){
   }
}

使用配置类注册Listener

@Configuration
public class ListenerConfig {
    @Bean
    public ServletListenerRegistrationBean getServletListenerRegistrationBean(){
        ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(new SecondListener());
        return bean;
   }
}

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

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

相关文章

python调用钉钉发送告警消息

zabbix和prometheus都能做监控告警调用企业微信和钉钉。那么问题来了做为一名合格的运维和开发人员&#xff0c;脚本发现故障告警&#xff0c;自动调用发送详细告警内容&#xff0c;这点儿东西得会。 效果图如下&#xff1a; 普通发送方式 import requestsdef dingding_info(…

学习系统编程No.30【多线程控制实战】

引言&#xff1a; 北京时间&#xff1a;2023/7/7/9:58&#xff0c;耳机正在充电中&#xff0c;所以刚好让我们先把引言写一写&#xff0c;昨天睡觉前听了一会小说&#xff0c;听小说的好处就在于&#xff0c;它可以让你放下手机&#xff0c;快速睡觉&#xff0c;并且还有一定的…

【DBA课程-笔记】第2章:MongoDB数据数据查询与分析

目录 一、课程大纲 二、MongoDB 条件查询 1. 制造 MongoDB 测试数据 2. MongoDB 数据查询 与 SQL对应关系 3. MongoDB 查询运算符 4. MongoDB 数据查询、条件查询、过滤 5. MongoDB 条件查询命令 6. MongoDB 数据查询数组条件 A. 精确匹配数组元素&#xff1a; B. 无…

检测到错误页面web应用服务器版本信息泄露

详细描述 Web服务器未能正确处理异常请求导致Web服务器版本信息泄露&#xff0c;攻击者收集到服务器信息后可进行进一步针对性攻击。 解决办法 临时修复建议如下&#xff1a; 1、关闭web服务器错误提示。 2、关闭运行平台的错误提示。 3、建立错误机制&#xff0c;不要把真实…

校园课表微信小程序全栈项目

遇到的第一个问题关于npm start 首先找到对应的后端项目 crtl shift (esc键下的波浪号) 召唤终端 Error:Cannot find module dotenv 解决问题: npm install dotenv 简写 npm i dotenv 然后遇到第二个问题 Port 3000 is already in use 我的3000接口被占用 那就要去检…

leetcode 74. 搜索二维矩阵(java)

搜索二维矩阵 leetcode 74. 搜索二维矩阵题目描述抽象BST代码演示 抽象BST leetcode 74. 搜索二维矩阵 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/search-a-2d-matrix 题目描述 给你一个满足下述两条属性的 m x n 整…

uniapp和uview组件实现下拉触底刷新列表

下面是一个在UniApp中使用uView组件实现下拉触底刷新列表的示例&#xff0c;并使用Axios来请求分页数据列表&#xff1a; 首先&#xff0c;确保你已经在UniApp项目中添加了uView组件库。你可以在项目根目录执行以下命令安装它们&#xff1a; npm install uview-ui或者使用 Hb…

【Vue3】setup参数细讲!computed计算属性和watch监听属性

setup参数细讲&#xff01;computed计算属性和watch监听属性 setup细讲!setup参数&#xff0c;steup&#xff08;props&#xff0c;context&#xff09;参数1.props&#xff0c;负责接收父组件传过来的值参数2.contextcontext.attrscontext.emitcontext.slots&#xff0c; 插槽…

CSS 伪元素: ::marker 自定义列表序号

::marker 伪元素 ::marker&#xff0c;可作用在任何设置了 display: list-item 的元素或伪元素上&#xff0c;例如<li>和<summary>。 /** <ul><li>Peaches</li><li>Apples</li><li>Plums</li> </ul> */ ul li::…

Java 设计模式——迭代器模式

目录 1.概述2.结构3.案例实现3.1.抽象迭代器3.2.具体迭代器3.3.抽象聚合3.4.具体聚合3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——Iterator 1.概述 迭代器模式 (Iterator Pattern) 是一种行为型设计模式&#xff0c;它提供一种顺序访问聚合对象&#xff08;如列表、集合等&…

Hyperledger Fabric测试网络运行官方Java链码[简约版]

文章目录 启动测试网络使用peer CLI测试链码调用链码 启动测试网络 cd fabric-samples/test-networknetwork.sh的脚本语法是&#xff1a;network.sh <mode> [flag] ./network.sh up./network.sh createChannel在java源码路径下 chmod 744 gradlew vim gradlew :set ffu…

「观察者(Observer)」设计模式 Swift实现

这里写目录标题 介绍设计模式介绍举例 iOS 中已有的 观察者设计模式实现Notification什么是通知机制或者说如何实现通知机制&#xff1f; KVOKVO底层实现如何实现手动KVO&#xff1f; 介绍 设计模式介绍 观察者设计模式&#xff08;Observer Pattern&#xff09;是一种行为型…

【ArcGIS Pro二次开发】(49):村规数据入库【福建省】

之前用Arcpy脚本工具做了一个村规数据入库和主要图纸生成工具。 在使用过程中&#xff0c;感觉对电脑环境比较高&#xff0c;换电脑用经常会一些莫名其妙的错误&#xff0c;bug修得很累。近来随着ArcGIS Pro SDK的熟悉&#xff0c;就有了移植的想法。 这里先把村规数据入库工…

TabLayout+ViewPager实现滚动页面

目录 一、TabLayout介绍 二、TabLayout的常用属性和方法 常用属性&#xff1a; 常用方法&#xff1a; 三、适配器介绍 &#xff08;一&#xff09;、PagerAdapter介绍&#xff1a; &#xff08;二&#xff09;、FragmentPagerAdapter介绍&#xff1a; &#xff08;三&am…

Python结巴中文分词笔记

&#x1f4da; jieba库基本介绍 &#x1f310; jieba库概述 Jieba是一个流行的中文分词库&#xff0c;它能够将中文文本切分成词语&#xff0c;并对每个词语进行词性标注。中文分词是自然语言处理的重要步骤之一&#xff0c;它对于文本挖掘、信息检索、情感分析等任务具有重要…

Android.mk 文件使用解析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Android.mk 简介二、Android.mk 的基本格式三、Android.mk 深入学习一四、 Android.mk 深入学习二五、 Android.mk 深入学习三六、 Android.mk 判断…

引入头文件#include <iostream>的时候发生了什么?

<iostream> namespace std {extern istream cin;extern ostream cout;extern ostream cerr;extern ostream clog;extern wistream wcin;extern wostream wcout;extern wostream wcerr;extern wostream wclog;};cin是什么&#xff1f; cin extern istream cin; The objec…

关于Windows 11 docker desktop 运行doris 容器时vm.max_map_count=2000000的设置问题

需要一个简单的测试环境&#xff0c;于是准备用docker启动一个1fe 1be的简单玩一下 如果be容器启动后再去修改 /etc/sysctl.conf sysctl -w vm.max_map_count2000000 这个参数是没用的&#xff0c;be仍然会启动失败 这时可以打开cmd wsl --list C:\Users\pc>wsl --list …

TeeChart for.NET Crack

TeeChart for.NET Crack TeeChart for.NET为各种图表需求提供了图表控件&#xff0c;包括金融、科学和统计等重要的垂直领域。它可以处理您的数据&#xff0c;在各种平台上无缝创建信息丰富、引人入胜的图表&#xff0c;包括Windows窗体、WPF、带有HTML5/Javascript渲染的ASP.N…

用户、角色、权限、菜单--数据库设计

用户角色关联表--user_role id-------------------主键 user_id------------用户ID role_id-------------角色ID create_time------创建时间 is_deleted--------状态&#xff08;0&#xff1a;未删除 1&#xff1a;删除&#xff09; 角色权限关联表--role_permission id------…