前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot---入门和配置

SpringBoot---入门和配置

作者头像
大忽悠爱学习
发布2021-11-15 14:32:48
8980
发布2021-11-15 14:32:48
举报
文章被收录于专栏:c++与qt学习

SpringBoot

SpringBoot的简介


微服务


环境约束


maven设置—默认使用jdk-1.8版本来编译和运行项目

代码语言:javascript
复制
	    <profile>
      <id>jdk-1.8</id>
      <activation>
	  <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>
          <properties>
		  <maven.compiler.source>1.8</maven.compiler.source>
		  <maven.compiler.target>1.8</maven.compiler.target>
		  <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
		  </properties>
    </profile>

SpringBoot的hello world入门案例

1.创建maven工程

2.导入springBoot的依赖

代码语言:javascript
复制
<!--导入一个父项目-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
  </parent>
  <dependencies>
    <!--添加starter-web模块的依赖-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>

3.编写主程序,启动springboot应用

代码语言:javascript
复制
package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//来标注一个主程序类,说明这是一个springBoot应用程序
@SpringBootApplication
public class Hello {
    public static void main(String[] args)
    {
        //spring应用启动起来
        SpringApplication.run(Hello.class,args);
    }
}

4.编写相关的controller和service

代码语言:javascript
复制
package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @ResponseBody
    @RequestMapping("/hello")
    public String hello()
    {
        return "hello world";
    }
}

5.运行主程序测试


6.部署,将项目打包成可执行的jar包,安装插件即可

代码语言:javascript
复制
      <!-- 将应用打包成可执行jar包 -->
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>

命令行使用java -jar的命令执行这个jar包即可,记住先要来到当前jar包对应的目录,通过cd 目录路径–》来到对应目录


Hello World探究

POM文件

父项目(父依赖)

启动器


主程序类(入口类)

代码语言:javascript
复制
//来标注一个主程序类,说明这是一个springBoot应用程序
@SpringBootApplication
public class Hello {
    public static void main(String[] args)
    {
        //spring应用启动起来
        SpringApplication.run(Hello.class,args);
    }
}

下面是@SpringBootApplication个注解的内部信息:

下面解释这里面的组合注解的意思:

注意: springboot的包扫描底层原理

底层的@import注解,会帮我们导入非常多的配置类,例如:实现aop功能的配置类,实现批处理的…


使用Spring Initializer快速创建SpringBoot项目

在控制类上可以使用@RestController替换@ResponseBody和@Controller注解

代码语言:javascript
复制
//这个类的所有方法返回的数据直接写给浏览器(如果是对象转为json数据)
/*@ResponseBody
@Controller*/
@RestController//替换上面两个注解
public class helloController {
     @RequestMapping("/hello")
    public String hello()
     {
         return "大忽悠";
     }
}

配置文件

SpringBoot全局配置文件的名字是固定的application,但是格式可以是properties或者yml(yaml)


yaml配置文件


YAML基本语法

1.基本语法

2.值的写法

字面量: 普通的值(数组,字符串,布尔)

对象,Map(属性和值)(键值对)

数组(List,Set)


YAML配置文件注入组件

yaml:

代码语言:javascript
复制
server:
  port: 8081



person:
  name: 大忽悠
  age: 18
  boss: false
  birth: 2002/1/2
  maps: {k1: v1,k2: 12}
  lists:
    - 历史
    - 语文
    - 数学
  dog:
    name: 小狗
    age: 1

将配置文件中配置的每一个属性的值,映射到这个组件中;

@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中的相关的配置进行绑定

prefix = “person”:配置文件中哪个下面的所有属性进行一一映射

只有这个组件是容器中的组件,才能使用容器中提供的@ConfigurationProperties功能

peo类:

代码语言:javascript
复制
/*
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中的相关的配置进行绑定
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能使用容器中提供的@ConfigurationProperties功能
* */
@Controller
@ConfigurationProperties(prefix = "person")
public class peo
{
    private  String name;
    private  Integer age;
    private  Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private  Dog dog;

    @Override
    public String toString() {
        return "peo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
}

导入配置文件处理器的依赖,这样对应组件和配置文件进行绑定就会有提示,且打包时排除对应的依赖

springboot的注释配置处理器没有在类路径下找到,需要导入配置文件处理器的依赖

代码语言:javascript
复制
        <!-- 导入配置文件处理器,配置文件进行绑定就会有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
</build>

SpringBoot单元测试刚才的注入结果

如果要完成对应类属性的注入,那么对应的类要提供set方法

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringBootQuickStartOneApplicationTests {
    @Autowired
    peo people;
    @Test
    void contextLoads()
    {
        System.out.println(people);
    }
}

properties配置文件编码问题

显示结果:(出现乱码问题)===》原因:idea使用的是UTF-8 而properties文件一般都是ASCALL

代码语言:javascript
复制
#配置person的值
person.name=大忽悠
person.age=18
person.birth=2002/1/2
person.maps.k1=v1
person.maps.k2=14
person.lists=1,2,3
person.dog.name=dog
person.dog.age=2

解决方案如下

结果


IDEA springboot项目中properties配置文件 {针对将对应GBK改为UTF-8并勾选转为ASCII后仍无效情况} 运行时中文乱码解决

IDEA springboot项目中properties配置文件 {针对将对应GBK改为UTF-8并勾选转为ASCII后仍无效情况} 运行时中文乱码解决


@Value注解和 @ConfigurationProperties的区别

@Value注解使用演示:

代码语言:javascript
复制
@Controller
public class peo
{
    /*
    * <bean>
       <property name="name" value="字面值/${key}从环境变量,配置文件中获取值/#{SPEL}"></property>
    * </bean>
    * */
    @Value("${person.name}")
    private  String name;
    @Value("#{11*2}")
    private  Integer age;
    @Value("true")
    private  Boolean boss;

配置文件yml还是properties他们都可以获取到值

如果我们只是需要在业务逻辑中获取一下配置文件中的值,可以使用@Value注解

如果说我们编写了一个类和配置文件进行映射,我们就直接使用 @ConfigurationProperties


对于是否支持JSR303校验的演示

SpringBoot @Vaild注解拦截不生效的问题解决

不要单独引入包,可能引入的包不全导致不生效!

直接引入SpringBoot 的starter

代码语言:javascript
复制
<!--引入JSR303校验启动器-->
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
        </dependency>

注解@ConfigurationProperties 和 @Value 对比,详细篇

注解@ConfigurationProperties 和 @Value 对比


@ConfigurationProperties(prefix = “person”)默认从全局配置文件中获取值,全局配置文件的名字是固定的application


@PropertySource加载指定配置文件===>加载类路径下peo.properties,并绑定到对象中

代码语言:javascript
复制
@PropertySource(value={"classpath:peo.properties"})
@Controller
@ConfigurationProperties(prefix = "person")
public class peo
{
    private  String name;
    private  Integer age;
    private  Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private  Dog dog;

要注意Spring Boot配置文件的加载顺序,如果全局配置文件.properties, .yaml和peo.properties中都符合前缀匹配条件,那么先执行全局配置文件

全局配置文件中.properties优先级高于.yaml

全局配置文件都不满足,才会执行peo.properties


@PropertySource 注解的使用详情看下面这两篇文章

@PropertySource 注解的使用

@PropertySource和@ConfigurationProperties


Spring Boot配置文件的加载顺序详情看下面这篇文章

【小家Spring】一篇文章彻底搞懂Spring Boot配置文件的加载顺序(项目内部配置和外部配置)


@ImportResource:导入Spring的配置文件,让配置文件中的内容生效

spring.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.Bean.pig" id="pig"/>
</beans>

springBoot单元测试:

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringBootQuickStartOneApplicationTests {
    @Autowired
    peo people;
    @Autowired //注入IOC容器
    ApplicationContext ioc;
    @Test
    void contextLoads()
    {
        //判断容器中是否由pig
        boolean ret = ioc.containsBean("pig");
        System.out.println(ret);
    }
}

如果此时不在配置类上导入我们写的spring的配置文件,那么结果为false,即容器中没有保存对应的Bean

如果写了,如下面这样:

代码语言:javascript
复制
@ImportResource(locations = {"classpath:spring.xml"})
@SpringBootApplication
public class SpringBootQuickStartOneApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootQuickStartOneApplication.class, args);
    }
}

SpringBoot推荐给容器中添加组件的方式,推荐使用全注解的方式

配置类=====Spring配置文件

@Configuration: 指明当前类是一个配置类,替代之前Spring配置文件

@Bean(“此处可以设置id名”):将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名(不是首字母小写)

配置类:

代码语言:javascript
复制
@Configuration//指明当前类是一个配置类,替代之前Spring配置文件
public class MyConfig
{
    @Bean("pig")//将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名(不是首字母小写)
   public pig HelloPig()
   {
       return new pig();
   }

}

单元测试类:

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringBootQuickStartOneApplicationTests {
    @Autowired
    peo people;
    @Autowired //注入IOC容器
    ApplicationContext ioc;
    @Test
    void contextLoads()
    {
        //判断容器中是否由pig
        boolean ret = ioc.containsBean("HelloPig");
        System.out.println(ret);
    }
}

配置文件中的占位符


Propfile多环境支持


多profile文件


在application.properties主配置文件中激活不同环境的配置文件

SpringBoot项目多环境配置(亲测有效)


在application.yml主配置文件中激活不同环境的配置文件

命令行的方式激活=项目打成jar包 ,然后启动dos命令行的方式激活以及使用虚拟机参数方式激活


SpringBoot配置Profile多环境支持可以看下面这篇文章

SpringBoot配置Profile多环境支持


springboot多环境(dev、test、prod) 配置详解可以看下面这篇文章

pringboot多环境(dev、test、prod) 配置详解可以看下面这篇文章


配置文件加载位置

优先级高的覆盖优先级低的,可以注意点的是,只是对相同配置项才会产生覆盖作用,不同的话是互补作用,也就是说如果四个地方都配了的话,是会累加起来的。

Spring会从这四个位置全部加载主配置文件===》互补配置

例如:我们在高优先级配置文件中配置了端口号,低优先级配置文件中配置了端口号和项目的访问路径,那么高优先级只会覆盖低优先级的端口号,访问路径还是采用低优先级的

server.port=8081 ===>配置端口号
servlet.context-path=/hello ===>配置项目的访问路径

我们可以通过spring.config.location引用外部配置文件

application配置文件里面指定spring.config.location的优先级太低了,加载太迟了,导致加载不到特定的配置文件,因此在通过命令行启动的方式可以提高优先级,加载到配置文件。

这是只是提高了优先级,但还是遵循互补配置,多用于项目打包完以后,需要对某几项配置进行修改,覆盖原先的配置

springboot 如何引用外部配置文件(spring.config.location)


Spring Boot 支持多种外部配置方式,如下所示,从上往下加载优先级由高到低,内容相同时覆盖,不相同时累加。

spring可以从以下位置加载配置,优先级从高到低,高优先级的配置会覆盖低优先级的配置,所有的配置会形成互补配置

1、命令行参数 2、来自 java:comp/env 的 JNDI 属性 3、使用“spring.config.location”改变默认的配置文件位置 4、Java 系统属性(System.getProperties()) 5、操作系统环境变量 6、RandomValuePropertySource 配置的 random.* 属性值 7、jar 包外部的 application-{profile}.properties 或 application.yml (带spring.profile) 配置文件 8、jar 包内部的 application-{profile}.properties 或 application.yml (带spring.profile) 配置文件 9、jar 包外部的 application.properties 或 application.yml (不带spring.profile) 配置文件 10、jar 包内部的 application.properties 或 application.yml (不带spring.profile) 配置文件 11、@Configuration注解类上的@PropertySource 12、通过SpringApplication.setDefaultProperties指定的默认属性


关于外部配置文件加载顺序推荐看下面这篇文章,上面记录的可能不够详细

Spring Boot 配置文件加载位置与顺序、外部配置文件加载顺序


项目打包时,只会打包main,java和resources目录下面的资源

自动配置的原理(重点)


精髓


自动配置原理和涉及到的一些注解解释可以参考以下文章

涉及到了@EnableConfigurationProperties 注解和@Conditional注解,还有其他一些注解

关与 @EnableConfigurationProperties 注解

关于 @EnableConfigurationProperties 注解

@Conditional详解

SpringBoot自动配置的原理及实现

spring boot(二):启动原理解析


自动配置原理中细节—condition注解的扩展

自动配置类再一定条件下才会生效

在配置文件中添加debug=true,可以开启springBoot的debug模式,让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringBoot
  • SpringBoot的简介
  • 微服务
  • 环境约束
  • maven设置—默认使用jdk-1.8版本来编译和运行项目
  • SpringBoot的hello world入门案例
    • 1.创建maven工程
      • 2.导入springBoot的依赖
        • 3.编写主程序,启动springboot应用
          • 4.编写相关的controller和service
            • 5.运行主程序测试
          • 6.部署,将项目打包成可执行的jar包,安装插件即可
          • Hello World探究
            • POM文件
              • 父项目(父依赖)
              • 启动器
          • 主程序类(入口类)
            • 注意: springboot的包扫描底层原理
              • 底层的@import注解,会帮我们导入非常多的配置类,例如:实现aop功能的配置类,实现批处理的…
              • 使用Spring Initializer快速创建SpringBoot项目
                • 在控制类上可以使用@RestController替换@ResponseBody和@Controller注解
                • 配置文件
                  • SpringBoot全局配置文件的名字是固定的application,但是格式可以是properties或者yml(yaml)
                    • yaml配置文件
                      • YAML基本语法
                        • 1.基本语法
                      • 2.值的写法
                        • 字面量: 普通的值(数组,字符串,布尔)
                        • 对象,Map(属性和值)(键值对)
                        • 数组(List,Set)
                      • YAML配置文件注入组件
                        • 将配置文件中配置的每一个属性的值,映射到这个组件中;
                        • @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中的相关的配置进行绑定
                        • prefix = “person”:配置文件中哪个下面的所有属性进行一一映射
                        • 只有这个组件是容器中的组件,才能使用容器中提供的@ConfigurationProperties功能
                        • 导入配置文件处理器的依赖,这样对应组件和配置文件进行绑定就会有提示,且打包时排除对应的依赖
                      • SpringBoot单元测试刚才的注入结果
                        • 如果要完成对应类属性的注入,那么对应的类要提供set方法
                      • properties配置文件编码问题
                        • 显示结果:(出现乱码问题)===》原因:idea使用的是UTF-8 而properties文件一般都是ASCALL
                        • 解决方案如下
                      • 结果
                        • @Value注解和 @ConfigurationProperties的区别
                          • 配置文件yml还是properties他们都可以获取到值
                          • 如果我们只是需要在业务逻辑中获取一下配置文件中的值,可以使用@Value注解
                          • 如果说我们编写了一个类和配置文件进行映射,我们就直接使用 @ConfigurationProperties
                          • 对于是否支持JSR303校验的演示
                          • SpringBoot @Vaild注解拦截不生效的问题解决
                          • 注解@ConfigurationProperties 和 @Value 对比,详细篇
                      • @ConfigurationProperties(prefix = “person”)默认从全局配置文件中获取值,全局配置文件的名字是固定的application
                        • @PropertySource加载指定配置文件===>加载类路径下peo.properties,并绑定到对象中
                          • 要注意Spring Boot配置文件的加载顺序,如果全局配置文件.properties, .yaml和peo.properties中都符合前缀匹配条件,那么先执行全局配置文件
                            • 全局配置文件中.properties优先级高于.yaml
                              • 全局配置文件都不满足,才会执行peo.properties
                                • @PropertySource 注解的使用详情看下面这两篇文章
                                  • Spring Boot配置文件的加载顺序详情看下面这篇文章
                                  • @ImportResource:导入Spring的配置文件,让配置文件中的内容生效
                                  • SpringBoot推荐给容器中添加组件的方式,推荐使用全注解的方式
                                    • 配置类=====Spring配置文件
                                      • @Configuration: 指明当前类是一个配置类,替代之前Spring配置文件
                                      • @Bean(“此处可以设置id名”):将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名(不是首字母小写)
                                  • 配置文件中的占位符
                                  • Propfile多环境支持
                                    • 多profile文件
                                      • 在application.properties主配置文件中激活不同环境的配置文件
                                        • 在application.yml主配置文件中激活不同环境的配置文件
                                          • 命令行的方式激活=项目打成jar包 ,然后启动dos命令行的方式激活以及使用虚拟机参数方式激活
                                            • SpringBoot配置Profile多环境支持可以看下面这篇文章
                                              • springboot多环境(dev、test、prod) 配置详解可以看下面这篇文章
                                              • 配置文件加载位置
                                                • 优先级高的覆盖优先级低的,可以注意点的是,只是对相同配置项才会产生覆盖作用,不同的话是互补作用,也就是说如果四个地方都配了的话,是会累加起来的。
                                                  • Spring会从这四个位置全部加载主配置文件===》互补配置
                                                    • 例如:我们在高优先级配置文件中配置了端口号,低优先级配置文件中配置了端口号和项目的访问路径,那么高优先级只会覆盖低优先级的端口号,访问路径还是采用低优先级的
                                                  • 我们可以通过spring.config.location引用外部配置文件
                                                    • application配置文件里面指定spring.config.location的优先级太低了,加载太迟了,导致加载不到特定的配置文件,因此在通过命令行启动的方式可以提高优先级,加载到配置文件。
                                                    • 这是只是提高了优先级,但还是遵循互补配置,多用于项目打包完以后,需要对某几项配置进行修改,覆盖原先的配置
                                                  • Spring Boot 支持多种外部配置方式,如下所示,从上往下加载优先级由高到低,内容相同时覆盖,不相同时累加。
                                                    • spring可以从以下位置加载配置,优先级从高到低,高优先级的配置会覆盖低优先级的配置,所有的配置会形成互补配置
                                                    • 关于外部配置文件加载顺序推荐看下面这篇文章,上面记录的可能不够详细
                                                • 自动配置的原理(重点)
                                                  • 精髓
                                                    • 自动配置原理和涉及到的一些注解解释可以参考以下文章
                                                      • 涉及到了@EnableConfigurationProperties 注解和@Conditional注解,还有其他一些注解
                                                    • 自动配置原理中细节—condition注解的扩展
                                                      • 自动配置类再一定条件下才会生效
                                                      • 在配置文件中添加debug=true,可以开启springBoot的debug模式,让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效
                                                  相关产品与服务
                                                  容器服务
                                                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                                  领券
                                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档