springboot搭建web项目与使用配置文件

目录

  • 一、准备工作
  • 二、创建基础web项目
    • 1. maven配置
    • 2.创建maven项目、配置pom.xml为web基础项目
    • 3.编写启动类
    • 4.使用maven打包
    • 5.使用命令java -jar xxx.jar运行
    • 5.快捷生成
  • 三、springboot配置文件
    • 1.application.properties
    • 2.application.yml
    • 3.获取配置文件内容到javabean
    • 4.@ConfigurationProperties与@Value赋值的异同
    • 5.@PropertySource
    • 6.@ImportResource
    • 7.配置文件占位符
    • 8.profile环境配置
    • 9.配置文件加载位置
    • 10.配置文件加载顺序
    • 11.配置文件的属性来源
一、准备工作
  • jdk1.8
  • apache maven 3.3.9
  • ide : eclipse | idea
  • spring官网:https://spring.io/
二、创建基础web项目 1. maven配置 【springboot搭建web项目与使用配置文件】编写M2_HOME/conf/setting.xml
1. 指定本地maven仓库 D:\APP\repository2. 配置远程仓库镜像(以阿里云为例) alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central 3. 配置全局jdk版本jdk-1.8true 1.81.8 1.8 1.8

2.创建maven项目、配置pom.xml为web基础项目
1. web项目基础依赖org.springframework.boot spring-boot-starter-parent 2.1.7.RELEASE org.springframework.boot spring-boot-starter-web

3.编写启动类 启动类需要与service、controller、dao等包同级,便于后面自动扫描
1.启动类
  • @SpringBootApplication
    • @SpringBootConfiguration------表示是一个springboot配置类
      • @Configuration------表示是一个spring配置类,等价于spring中的配置文件xml
        • @Component------容器中的一个组件
    • @EnableAutoConfiguration------开启自动配置
      • @AutoConfigurationPackage------自动配置包,将主配置类所在包及旗下所有子包里面所有的组件扫描到springboot容器中,所以启动类需要和service等包同级
      • @Import({AutoConfigurationImportSelector.class})------给容器导入一个组件,导入的组件由AutoConfigurationImportSelector.class决定,该类会给容器导入大量的自动配置类(格式类似:xxxAutoConfiguraion),这些自动配置类来源于:spring-boot-configure/META-INF/spring.factories文件中
    • @ComponentScan------自动扫包配置
    @SpringBootApplication public class MySpringBootApplication { public static void main(String[] args) { SpringApplication.run(MySpringBootApplication.class,args); } }

2.接口类
当@ResponseBody加在方法上表示该方法返回的对象之间返回给浏览器,如果加载在类上,表示当前类下的所有方法都把返回对象之间返回给浏览器
@RestController == @Controller + @ResponseBody
@Controller public class Helloword {@RequestMapping("/hello") @ResponseBody public String hello() { return "Hello World"; } }

4.使用maven打包
1.配置pom.xml文件,默认打成jar包 org.springframework.boot spring-boot-maven-plugin

点击idea左下角的图标,点击maven projects => spring-boot-helloword =>
lifecycle => package
5.使用命令java -jar xxx.jar运行 取target文件夹下的spring-boot-helloword-1.0-SNAPSHOT.jar,
运行java -jar spring-boot-helloword-1.0-SNAPSHOT.jar
5.快捷生成 1.使用IDE生成
2.使用spring官网地址:https://start.spring.io
三、springboot配置文件 1.application.properties
  • 语法
    • lv1.lv2=value
    • lv1.lv2.lv3=false
    • lists=1,2,3
2.application.yml
  • 语法
    • key: value (注意冒号和value直接需要空格)
    • 用空格缩进来表示处于同一层级
  • 值范围
    • 字面值(普通值)直接用 k: v 来写
      • 字符串不用加上单引号或双引号
      • "":双引号里的特殊字符会表达,例如name: "zhang \n wang" 输出:zhang 换行 wang
      • '':单引号里的特殊字符不会表达,例如name: 'zhang \n wang' 输出:zhang \n wang
    • 对象、map
      ```yml
      #1.普通写法
      student:
      name: song
      age: 1
      #2.行内写法
      student: {name: song,age: 1}
      ```
    • 数组list、set
      yml #1.普通写法 pets: - cat - dog - pig #2.行内写法 pets: {cat,dog,pig}
3.获取配置文件内容到javabean
  • 需要借助@Component注解
  • 使用 @ConfigurationProperties(prefix="beanName") 注解来关联获取配置文件内容,其中beanName表示配置文件中属性的前缀,适用于application.properties、application.yml配置文件的内容获取
4.@ConfigurationProperties与@Value赋值的异同
  • @ConfigurationProperties:支持批量赋值、支持松散绑定(last-name等价于lastName)、不支持表达式计算、支持jsr303数据校验、支持复杂类型封装(object、map类型)
  • @Value:支持单个赋值、支持表达式计算
5.@PropertySource
  • 含义:@ConfigurationProperties加载的是系统默认的全局配置文件(application.properties、application.yml),而@PropertySource可以读取自定义的配置文件
  • 语法:@PropertySource(value = https://www.it610.com/article/{"classpath:person.properties"}),value可以是数组
6.@ImportResource 我们自己编写的xxx.xml配置文件,不会被spring和springboot识别,可以使用以下方法把xxx.xml中的bean引入到spring容器中
  • 方法一:可以在启动类(也是配置类)上,比如SpringbootApplication.java启动类上加@ImportResource(locations = {"calsspath:xxx.xml"})
  • 自定义一个配置类,标注上@Configuration,使用@Bean的方法引入组件到spring中
7.配置文件占位符
  • 随机数
    \({random.value}、\){random.int}
  • 占位符获取之前配置的值,如果没有可以用的:指定默认值
    name=aaa
    address=${name}_bbb
8.profile环境配置
  • 方式一:多profile文件(application-{profile}.properties)
    • application-dev.properties
    • application-sit.properties
    • application-prd.properties
#application.properties #激活dev环境的配置 spring.profiles.active=dev#application-dev.properties server.port=8081#application-prd.properties server.port=8082

  • 方式二:yml文档快指定配置环境方式
#application.yml #激活dev环境的配置 server port: 8080 spring profiles active: dev --- server port: 8081 spring profiles: dev --- server port: 8082 spring profiles: prd

  • 方式三:命令行方式
1.虚拟机指定 VM options: -Dspring.profiles.active=dev2.java命令指定 java -jar xxx.jar --spring.profiles.active=dev

9.配置文件加载位置
  • sprigboot启动会扫描以下位置的application.properties和application.yml来作为springboot的默认配置文件
  • 优先级(./config/ > ./),所以配置文件都会被加载
  • 对应重复的配置属性:高优先级会覆盖低优先级的文件配置属性
  • 对于不重复的配置属性:多文件的多属性会互补加载(都加载到springboot中)
  • 我们也可以通过配置spring.config.location来改变默认配置,仅是指定的文件优先级为最高,但是所有的配置文件还是会被一起加载到springboot,参考上面
file类型 ./config/ ./ classpath类型 ./config/ ./

10.配置文件加载顺序 优先级由高到低:
  • 命令行
    • 例如:java -jar xxx.jar --server.port=8085 --server.context-path=/abc
  • jar包外,带profile的
    • application-dev.properties
    • application-dev.yml
  • jar包内,带profile的
    • application-dev.properties
    • application-dev.yml
  • jar包外,不带profile的
    • application.properties
    • application.yml
  • jar包内,不带profile的
    • application-dev.properties
    • application-dev.yml
11.配置文件的属性来源 ==用好springboot配置文件的精髓==
  1. 寻找配置文件和class之间关联
  2. 启动类注解@SpringBootApplication
  3. 1的依赖注解@EnableAutoConfiguration
  4. 2的依赖导入@Import({AutoConfigurationImportSelector.class}),导入自动配置选择器类
  5. AutoConfigurationImportSelector.selectImports
  6. AutoConfigurationImportSelector.getAutoConfigurationEntry
  7. AutoConfigurationImportSelector.getCandidateConfigurations()
  8. 6方法内的SpringFactoriesLoader.loadFactoryNames()
  9. SpringFactoriesLoader.loadFactoryNames()
  10. SpringFactoriesLoader.loadSpringFactories()
  11. classLoader.getResources("META-INF/spring.factories")
  12. 找到maven依赖中的spring-boot-autoconfigure2.1.7.RELEASE.jar中META-INF/spring.factories
在spring.factories中以 org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,/ 为例:
  1. WebMvcAutoConfiguration.class
@Configuration @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class}) @ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) @AutoConfigureOrder(-2147483638) @AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class}) public class WebMvcAutoConfiguration { ... }

  1. 进入DispatcherServletAutoConfiguration.class
@AutoConfigureOrder(-2147483648) @Configuration @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({DispatcherServlet.class}) @AutoConfigureAfter({ServletWebServerFactoryAutoConfiguration.class}) public class DispatcherServletAutoConfiguration { ... }

  1. 进入ServletWebServerFactoryAutoConfiguration.class
@Configuration @AutoConfigureOrder(-2147483648) @ConditionalOnClass({ServletRequest.class}) @ConditionalOnWebApplication(type = Type.SERVLET) @EnableConfigurationProperties({ServerProperties.class}) @Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, EmbeddedTomcat.class, EmbeddedJetty.class, EmbeddedUndertow.class}) public class ServletWebServerFactoryAutoConfiguration { ... }

  1. 进入和ServletWebServerFactoryAutoConfiguration绑定的ServerProperties.class中
@ConfigurationProperties( prefix = "server", ignoreUnknownFields = true ) public class ServerProperties {private Integer port; private InetAddress address; public Integer getPort() { return this.port; }public void setPort(Integer port) { this.port = port; }public InetAddress getAddress() { return this.address; }public void setAddress(InetAddress address) { this.address = address; } //... }

  1. 控制台判断哪些自动配置类生效
    application.properties中配置:debug=true
  2. 总结:通过ServerProperties.class中的属性可以设置application.properties中的一些关于服务器的配置文件属性,例如:server.port,同样根据其他的xxx.properties也可以学习配置springboot的配置文件
转载于:https://www.cnblogs.com/songzhen/p/11484041.html

    推荐阅读