springboot搭建web項目與使用配置文件

1、準備工做

  • jdk1.8
  • apache maven 3.3.9
  • ide : eclipse | idea
  • spring官網:https://spring.io/

2、建立基礎web項目

1. maven配置

編寫M2_HOME/conf/setting.xmlweb

1. 指定本地maven倉庫
<localRepository>D:\APP\repository</localRepository>

2. 配置遠程倉庫鏡像(以阿里云爲例)
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

3. 配置全局jdk版本
<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>

2.建立maven項目、配置pom.xml爲web基礎項目

1. web項目基礎依賴
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

3.編寫啓動類

啓動類須要與service、controller、dao等包同級,便於後面自動掃描spring

1.啓動類apache

  • @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包
<build>
    <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
    </plugins>
</build>

點擊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.jarspringboot

5.快捷生成

1.使用IDE生成
2.使用spring官網地址:https://start.spring.io服務器

3、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: 1app

      #2.行內寫法
      student: {name: song,age: 1}
      ```
    • 數組list、set
      yml #1.普通寫法 pets: - cat - dog - pig #2.行內寫法 pets: {cat,dog,pig}dom

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 = {"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=dev

2.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的配置文件

相關文章
相關標籤/搜索