SpringBoot学习(三)——SpringBoot的配置

2023-11-16

一.入口类

  通常而言,Spring Boot都会拥有一个名为*Application的入口类(如FirstApplication),而该入口类中会有一个main方法。这个main方法起始就是一个标准的Java应用的入口方法。在main方法中使用SpringApplication.run(xxx.class,args)方法从而启动Spring Boot项目。

二.@Spring BootApplication注解

  Spring BootApplication注解是Spring Boot的核心注解,它是一个组合注解。

  @Spring BootApplication注解中就已经包含了@Configuration(@Spring BootConfiguration中),@ComponentScan及@EnableAutoConfiguration。如果不使用@Spring BootApplication注解,可以在入口类上添加@Configuration,@ComponentScan及@EnableAutoConfiguration三个注解。
  其中,@EnableAutoConfiguration注解会开启自动配置,简单点说就是它会根据定义在classpath下的类,自动的给你生成一些Bean,并加载到Spring的Context中。如在上一篇文章中( Spring Boot学习(二)——入门)的入门案例中添加了spring-boot-starter-web的依赖,则会开启Spring MVC自动配置。通过观察观察启动日志,我们发现应用启动了tomcat和spring mvc。

三.Spring Boot的配置文件

1.默认属性

  Spring Boot使用一个全局配置文件application.properties或者application.yml,该文件放置在src/main/resources目录下或者在类路径下的/config目录下。

1).使用application.properties

  配置文件如下:

#设置tomcat的端口号
server.port=8088
#设置项目的路径,server.context-path也可以用server.contextPath代替
server.context-path=/demo
#设置servlet的拦截路径
server.servlet-path=*.html

输出日志如下:

  此时访问项目的路径为localhost:8088/demo/xxx.html。其它配置可以参考SpringBoot官方的的参考文件
  地址链接:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

2).使用application.yml

  yml文件格式如下

server:
 port: 8088
 context-path: /demo
my:
 test: this is my property

  注意:
   1.以上属性相当于properties中配置了server.port、server.context-path、my.test三个属性,server相当于一级属性,port相当于二级属性,其中port前需要带有空格用于区分其是server的下级,如果不带空格则会认为port也是一级属性(即每一级属性要比上一级属性多一个空格缩进)
   2.每一级属性要比上一级属性多一个缩进,而且只能用空格,不能用Tab键进行缩进,否则报错。
   3.属性值前需要带空格,例如“port: 8088”,其中属性“port:”与属性值“8088”之间有个空格

2.自定义属性

  我们也可以在application.properties文件下自定义属性,如下:

my.test=this is my property

  controller类

    //引入属性
    @Value("${my.test}")
    public String test;

    @RequestMapping("/properties")
    @ResponseBody
    public String testProperties(){
        return test;
    }

  访问“;localhost:8080/properties”,此时页面输出“this is my property”

3.多属性自动引入

  当配置文件中有多个属性时,可以通过@ConfigurationProperties注解引入,如果属性名前缀(如myProperties.name),可以在@ConfigurationProperties注解中添加prefix属性(如@ConfigurationProperties(prefix = “myProperties”))来指定前缀。
  注意:该方式是以字段的setter方法注入,所以不能省略字段的setter方法。
  如果需要指定配置文件,可以使用@PropertySource注解指定文件路径(如@PropertySource(“classpath:config/myProperties.properties”))
  配置文件如(路径为classpath:config/myProperties.properties):

myproperties.name=zs
myproperties.age=23

   测试类

@Controller
@ConfigurationProperties(prefix = "myproperties")
@PropertySource("classpath:config/myProperties.properties")
public class HelloSpringBoot {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @RequestMapping("/myproperties")
    @ResponseBody
    public void testMyProperties(){
        System.out.println("name="+name+",age="+age);
    }
}

   访问路径“localhost:8080/myproperties”,此时控制台输出“name=zs,age=23”

四.自定义banner

  在项目启动时打印的banner可以通过在类路径添加一个banner.txt文件,或者通过在配置文件(application.properties)中设置banner.location属性到此类文件的位置来更改。如果文件有一个不常用的编码,可以设置banner.charset属性(默认是UTF-8)。除了文本文件,还可以将banner.gif,banner.jpg或banner.png图像文件添加到您的类路径中,或者设置banner.image.location属性。图像将被转换成ASCII艺术表现,并打印在任何文字横幅上方。
  可以通过http://patorjk.com/software/taag网站生成字符,直接将生成的字符复制到banner.txt文件中即可。
  提供一个字符画生成网站http://y.qq.com/m/demo/ctools/charimg.html

                          _ooOoo_
                         o8888888o
                         88" . "88
                         (| ^_^ |)
                         O\  =  /O
                      ____/`---'\____
                    .'  \\|     |//  `.
                   /  \\|||  :  |||//  \
                  /  _||||| -:- |||||-  \
                  |   | \\\  -  /// |   |
                  | \_|  ''\---/''  |   |
                  \  .-\__  `-`  ___/-. /
                ___`. .'  /--.--\  `. . ___
              ."" '<  `.___\_<|>_/___.'  >'"".
            | | :  `- \`.;`\ _ /`;.`/ - ` : | |
            \  \ `-.   \_ __\ /__ _/   .-` /  /
      ========`-.____`-.___\_____/___.-`____.-'========
                           `=---='
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        
            *************佛祖保佑*************
            *************永不宕机*************
            *************永无BUG*************

  如果不需要banner,可以按以下方式启动

    SpringApplication application = new SpringApplication(FirstApplication.class);
    //Mode.CONSOLE表示输出至控制台
    //Mode.LOG表示输出至日志
    //Mode.OFF表示不输出banner
    application.setBannerMode(Mode.OFF);
    application.run(args);

五.Starter配置

  Starter是一组方便的依赖关系描述符,可以包含在应用程序中。 您可以获得所需的所有Spring和相关技术的一站式服务,而无需通过示例代码搜索和复制粘贴相关性描述符的配置。 例如,如果要开始使用Spring和JPA进行数据库访问,那么只需在项目中包含spring-boot-starter-data-jpa依赖项,然后你就可以开始使用。
  Starter包含许多您需要使项目快速启动并运行的依赖关系,并支持依赖maven的管理依赖传递。
  官方提供的Stater参考https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-starter

六.加载的配置

  Spring Boot支持基于Java的配置。虽然可以使用XML源调用SpringApplication.run(),但我们通常建议您的主源是一个@Configuration类。通常,定义main方法的类也是一个很好的候选者,作为主要的@Configuration。
  许多Spring配置示例已经在Internet上发布,使用XML配置。始终尝试使用等效的基于Java的配置,如果可能的话。搜索启用*注释可以是一个很好的起点。

1.导入其他配置类

  我们不需要将所有的@Configuration放在一个类中。 @Import注释可用于导入其他配置类。或者可以使用@ComponentScan自动扫描所有Spring组件,包括@Configuration类。

2.导入XML配置

  官方推荐使用Java类的配置,但是如果我们绝对必须使用基于XML的配置,可以在入口类中使用额外的@ImportResource注释来加载XML配置文件。

@ImportResource({“classpath:some.xml”,”classpath:other.xml”})

七.自动配置原理

1.如何自动加载配置

  是否自动加载类是根据@EnableAutoConfiguration注解中@Import(EnableAutoConfigurationImportSelector.class)进行判断。
  查看SpringApplication的静态run方法会创建一个SpringApplication对象,而构造方法会调用initialize方法,initialize方法如下:

  查看spring-boot-autoconfigure-1.5.2.RELEASE.jar的META-INF/spring.factories文件,里面配置了自动配置类的全路径,如下(此处只截取了部分):

2.配置注解

  查看任意一个Auto Configure文件,一般都有下面的条件注解,在spring-boot-autoconfigure-1.5.2.RELEASE.jar的org.springframework.boot.autoconfigure.condition包下,条件注解如下:

条件注解 对应的Condition处理类 处理逻辑
@ConditionalOnBean OnBeanCondition Spring容器中是否存在对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找)这些属性都是数组,通过”与”的关系进行查找
@ConditionalOnClass OnClassCondition 类加载器中是否存在对应的类。可以通过Class指定(value属性)或者Class的全名指定(name属性)。如果是多个类或者多个类名的话,关系是”与”关系,也就是说这些类或者类名都必须同时在类加载器中存在
@ConditionalOnExpression OnExpressionCondition 判断SpEL 表达式是否成立
@ConditionalOnJava OnJavaCondition 指定Java版本是否符合要求。内部有2个属性value和range。value表示一个枚举的Java版本,range表示比这个老或者新于等于指定的Java版本(默认是新于等于)。内部会基于某些jdk版本特有的类去类加载器中查询,比如如果是jdk9,类加载器中需要存在java.security.cert.URICertStoreParameters;如果是jdk8,类加载器中需要存在java.util.function.Function;如果是jdk7,类加载器中需要存在java.nio.file.Files;如果是jdk6,类加载器中需要存在java.util.ServiceLoader
@ConditionalOnMissingBean OnBeanCondition Spring容器中是否缺少对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找)这些属性都是数组,通过”与”的关系进行查找。还多了2个属性ignored(类名)和ignoredType(类名),匹配的过程中会忽略这些bean
@ConditionalOnMissingClass OnClassCondition 跟ConditionalOnClass的处理逻辑一样,只是条件相反,在类加载器中不存在对应的类
@ConditionalOnNotWebApplication OnWebApplicationCondition 应用程序是否是非Web程序,没有提供属性,只是一个标识。会从判断Web程序特有的类是否存在,环境是否是Servlet环境,容器是否是Web容器等
@ConditionalOnProperty OnPropertyCondition 应用环境中的屬性是否存在。提供prefix、name、havingValue以及matchIfMissing属性。prefix表示属性名的前缀,name是属性名,havingValue是具体的属性值,matchIfMissing是个boolean值,如果属性不存在,这个matchIfMissing为true的话,会继续验证下去,否则属性不存在的话直接就相当于匹配不成功
@ConditionalOnResource OnResourceCondition 是否存在指定的资源文件。只有一个属性resources,是个String数组。会从类加载器中去查询对应的资源文件是否存在
@ConditionalOnSingleCandidate OnBeanCondition Spring容器中是否存在且只存在一个对应的实例。只有3个属性value、type、search。跟ConditionalOnBean中的这3种属性值意义一样
@ConditionalOnWebApplication OnWebApplicationCondition 应用程序是否是Web程序,没有提供属性,只是一个标识。会从判断Web程序特有的类是否存在,环境是否是Servlet环境,容器是否是Web容器等
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot学习(三)——SpringBoot的配置 的相关文章

随机推荐

  • Unity 使Text文本内容配合音频逐个显示并动态设置富文本

    在做一个项目时 需要Text文本内容逐个显示 并且配合音频的播放速度 当音频结束时 文本也显示完毕 而且给每一段文本设置不同的颜色和字号 代码如下 using System Collections using System Collecti
  • jenkins exec command 命令不执行

    本文记述的exec command 命令不执行情况是因为用户权限导致的 根据结果反馈就好像该设置不存在一样但是也没有报错 情况1 前端项目linux截图如下 图中1标志为jenkins所打的包 但是2标志是root账号的dist文件 因权限
  • plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致

    plsql 登录后提示 Database character set AL32UTF8 and Client character set ZHS16GBK are different Character set conversion may
  • Qt信号槽连接方式源码解读

    前言 Qt的五 四 种连接方式 在上一篇已经讲明 本篇主要分析在源码上是如何实现这几种连接方式的 本次源码为Qt 5 15 2 搞懂务必认真阅读最后添加注释后的代码 connect时会做什么 已知connect是可以实现一个信号连接多个槽的
  • ORT执行推理如何指定device编号

    法1 在执行推理前运行命令指定卡号 如 export CUDA VISIBLE DEVICES 1 python test py ox resnet50 16 fp32 说明 编号从0开始 通过上面的方式指定后 推理任务会在第2张卡中运行
  • window 服务器不稳定,服务器Windows系统突发情况的解决办法

    服务器Windows系统现在还是大部分的站长的选择 有很多用户是使用Windows作为网站服务器的系统 今天小编对于服务器Windows系统在维护过程中出现的几种突发情况 来讲讲解决办法 1 终端协议错误 如果用记事本或其他编辑器在远程终端
  • lambda 函数完美使用指南

    来源 萝卜大杂烩 今天我们来学习 Python 中的 lambda 函数 并探讨使用它的优点和局限性 什么是 Python 中的 Lambda 函数 lambda 函数是一个匿名函数 即 没有名称定义 它可以接受任意数量的参数 但与普通函数
  • 浅拷贝和深拷贝的区别

    浅拷贝 Shallow Copy 和深拷贝 Deep Copy 是两种复制对象的方式 它们之间的主要区别在于复制过程中是否会复制对象内部的引用类型数据 浅拷贝 Shallow Copy 浅拷贝仅复制了对象本身以及对象内部的基本数据类型 如i
  • 医学图像2D/3D可视化 ITK-SNAP软件使用

    软件下载链接 ITK SNAP Home 1 导入医学图像 nii gz文件 File gt Open Main Image 点击 Browse 切记不能有中文路径 gt Next 2 载入相应的分割图数据 nii gz文件 Segment
  • Android学习笔记——归纳整理

    目录 一 Android系统架构 二 Actvity相关 2 1基础相关 2 2 Intent相关 2 2 1 Intent的组成 2 2 2 显式Intent 2 2 3 隐式Intent 2 2 4 Intent属性 2 2 5 Int
  • Spring 单元测试中如何进行 mock

    我们在使用 Spring 开发项目时 都会用到依赖注入 如果程序依赖了外部系统或者不可控组件 比如依赖数据库 网络通信 文件系统等 我们在编写单元测试时 并不需要实际对外部系统进行操作 这时就要将被测试代码与外部系统进行解耦 而这种解耦方法
  • objects365数据集下载

    链接 https pan baidu com s 1QiWm8hCJus3LstZkz6Mzdw 提取码 wmrx
  • MySQL的索引和事务

    一 索引 一 索引概念 索引是一种特殊的文件 包含数据库中所有记录的引用 可以对表中的一列或多列创建索引 并指定索引的类型 存储引擎 每种索引在不同的存储引擎中的实现都有可能不同 索引类似数组的下标 通过下标拿到数组中的数据是很快的 同样通
  • 字符串右移n位

    题目 实现字符串右移几位 即 abcd 移两位变 cdab 思路 申请一个与待移位同样大小的数组 用来保存移位后的字符串 通过公式计算出简化的移位数 得到某字符移位后的新位置后 就将其字符值存放到新数组的对应位置 循环第3步 直至检测到字符
  • 【JVM】JVM基础知识:常量池、类加载、JVM内存模型、对象的创建过程

    前言 讲一下大概的内容 类加载 JVM内存模型 对象的创建 垃圾回收 JVM调优 入门 最近抽了时间学了一直都很想学的 JVM 之前也学过一点 也发布过一些零散的文章 但这篇文章会更加全面 学完这篇文章就足以应对有关 JVM 的面试 如果遇
  • java实现高斯赛德尔算法解线性方程组

    package linear equation import java util Scanner 使用高斯赛德尔迭代法求解线性方程组 public class Gauss Seidel Iterate 求下三角 private static
  • nodejs如何添加html文件上传,通过nodejs实现文件的上传

    通过nodejs实现文件的上传 主要内容 本文将用来讲述如何通过nodejs进行文件上传 将会涉及到以下知识点 通过express模块进行服务器的搭建 通过multer模块将上传的文件保存到指定目录 通过fs path模块将文件改名 添加后
  • SGMII协议解析

    什么是SGMII 先说什么是GMII MII MII是ethernet协议里面MAC层和PHY层之间的接口标准 MII是4bits的数据位宽 支持10 100M的数据传输 GMII前面G表示Gigabit 代表支持1000M的传输速率 需要
  • conda环境中安装1秒安装秘籍

    无论是pip或者mim安装指令 只需要加上一个参数就能1秒安装完成 pip install opencv python i https mirror baidu com pypi simple 体验完后 点个赞吧
  • SpringBoot学习(三)——SpringBoot的配置

    一 入口类 通常而言 Spring Boot都会拥有一个名为 Application的入口类 如FirstApplication 而该入口类中会有一个main方法 这个main方法起始就是一个标准的Java应用的入口方法 在main方法中使