spring - Springboot

启动类

//@SpringBootApplication  :  标注这个类是一个springboot的应用
@SpringBootApplication
//@ComponentScan("com.eden")
//这个注解要去掉,否则会启动定时任务,导致失败,因为没有配置定时任务
//@EnableScheduling
public class EdenAppblication {
  public static void main(){
    SpringApplication.run(EdenAppblication.class, args);
  }
}

解析启动类

从启动类中可以看出,使用了@SpringBootApplication注解,作用:启动类下的所有资源被导入。解析这个注解:

@SpringBootConfiguration:  springboot的配置
    @Configuration:  spring配置类
        @Component:  说明这也是一个spring组件

    
@EnableAutoConfiguration:  自动配置
    @AutoConfigurationPackage:  自动配置包
        @Import(AutoConfigurationPackage.Register.class):  自动配置`包注册`(解决为什么某些文件只能放到指定的路径下?)
    @Import(AutoConfigurationImportSelector.class):  自动配置导入选择器,这个是一个类,这个类中会有很多属性及方法:
        private Environment environment;//环境
        private ClassLoader classLoader;//类加载器
        private ResourceLoader resourceLoader;//资源加载器
        private ConfigurarionClassFilter configurarionClassFilter;//配置类过滤器

   

那么导入了哪些选择器呢?

springboot配置文件的优先级

application.properties / application.yaml / application.yml
文件有四个配置路径分别是:

  • file:./config 项目路径下新建一个config目录,里面添加application.yaml 优先级最高
  • file:./ 项目目录下添加application.yaml 优先级第二
  • classpath:/config/ resources目录下新建config目录,里面添加application.yaml 优先级第三
  • classpath:/ resources目录下添加application.yaml 优先级第四

如果同级目录下既有application.yaml 和 application.properties 则优先读取 application.properties 的文件内容

配置多环境配置文件

在application.properties文件中配置多环境配置文件

application.properties
application-local.properties
application-test.properties

在application.properties文件中指定使用那个环境的配置文件
spring.profile.active=local

spring.profiles.active=${app_env:local}

在application.yaml中配置多环境配置文件

在yaml配置文件中使用 --- 分隔多配置文件
使用 spring.profiles 指定对应的文件环境

sever:
  port: 8084

#指定使用那个环境下的配置文件
spring:
  profiles:
    active: dev

---
sever:
  port:8085

#指定配置文件的环境
spring:
  profiles: dev

---
sever:
  port:8086

# yaml配置文件格式
```yaml

person:
  name: qinjiang
  age: 3
  happy: false
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
   - code
   - girl
   - music
  dog:
    name: 旺财
    age: 1

yaml支持松散绑定 last-name ---> lastName

将yaml中的配置信息映射到实体类中

/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

使用指定的配置文件

@PropertySource(value = "classpath:eden.properties") :加载指定自定义的配置文件;
@ConfigurationProperties(prefix = "person"):默认从全局配置文件中获取值;
使用 @Value("${name}")的形式给属性赋值
使用 @Value 则默认根据属性名映射

1、我们去在resources目录下新建一个person.properties文件
name=eden

@PropertySource(value = "classpath:person.properties")
@Component //注册bean
public class Person {

    @Value("${name}")
    private String name;

    ......  
}

springboot能有哪些配置呢?

springboot的配置与META-INF/spring.factories有什么联系?

@SpringBootApplication
    @EnableAutoConfiguration
        @Import(AutoConfigurationImportSelectot.class)
            List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
                

这里会发现,在META-INF/spring.factories这个文件中的所有的自动配置的类,可以查看对应的自动配置类,这些类中会有前缀以及属性:
那么我们能配置的属性就是这些自动配置类中的属性。

xxxAutoConfiguration(默认值)  --->  xxxProperties(修改值) --->  (配置文件)根据指定的前缀找到配置文件中对应的配置项。

pom.xml分析


<!-- 父依赖 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
    <relativePath/>
</parent>

<!-- 依赖的jar包配置 -->
<dependencies>
    <!-- web场景启动器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>
    <!-- springboot单元测试 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <!-- 剔除依赖 -->
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- 打包插件 -->
        <!--
            在工作中,很多情况下我们打包是不想执行测试用例的
            可能是测试用例不完事,或是测试用例会影响数据库数据
            跳过测试用例执
            -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
               <configuration>
                  <!--跳过项目运行测试用例-->
                <skipTests>true</skipTests>
              </configuration>
        </plugin>
    </plugins>
</build>

JSR303校验

@Validated  //数据校验
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    @Email(message="邮箱格式错误")
    private String name;
}

常用的校验注解

。。。。

彩蛋--更改启动描述语

也就是 banner 图案;

只需一步:到项目下的 resources 目录下新建一个banner.txt 即可。

图案可以到:https://www.bootschool.net/ascii 这个网站生成,然后拷贝到文件中即可

posted @ 2021-10-12 14:29  依梦维马  阅读(55)  评论(0)    收藏  举报