SpringBoot(配置檔案)

一滴白雲發表於2020-12-09

1. @PropertySource

  @PropertySource:載入指定的配置檔案【properties】
  先前我們通過@ConfifigurationProperties載入全域性配置檔案中的值到javabean中,但是我們在具體使用的時候不會把所用的配置都儲存在全域性配置檔案中的,可能會將不同的配置儲存在不同的配置檔案中,那麼這時我們就需要@PropertySource註解為指定的javabean類載入指定的配置檔案
  例如:

package com.wangxing.springboot.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
public class PersonBean {
    private  int  perid;
    private  String pername;
    private  int perage;
    private  String  peraddress;

    public int getPerid() {
        return perid;
    }

    public void setPerid(int perid) {
        this.perid = perid;
    }

    public String getPername() {
        return pername;
    }

    public void setPername(String pername) {
        this.pername = pername;
    }

    public int getPerage() {
        return perage;
    }

    public void setPerage(int perage) {
        this.perage = perage;
    }

    public String getPeraddress() {
        return peraddress;
    }

    public void setPeraddress(String peraddress) {
        this.peraddress = peraddress;
    }
}
person.properties
person.perid=1002
person.pername=lisi
person.perage=24
person.peraddress=北京
package com.wangxing.springboot.controller;
import com.wangxing.springboot.bean.PersonBean;
import com.wangxing.springboot.bean.StudentBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
    @Autowired
    private PersonBean personBean;
    @RequestMapping(value = "/perinfo")
    @ResponseBody
    public String  getPersonInfo(){
        String  perinfo=personBean.getPerid()+"\t"+
                personBean.getPername()+"\t"+
                personBean.getPerage()+"\t"+
                personBean.getPeraddress();
        return  perinfo;
    }
}

2. @ImportResource

  @ImportResource:匯入基於XML的Spring的配置檔案,讓配置檔案裡面的內容生效;

package com.wangxing.springboot.bean;
public class UserBean {
    private  int  userid;
    private  String username;
    private  int userage;
    private  String  useraddress;
    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getUserage() {
        return userage;
    }

    public void setUserage(int userage) {
        this.userage = userage;
    }

    public String getUseraddress() {
        return useraddress;
    }

    public void setUseraddress(String useraddress) {
        this.useraddress = useraddress;
    }
}
package com.wangxing.springboot.controller;
import com.wangxing.springboot.bean.UserBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestController implements Controller {

    private UserBean userBean;

    public UserBean getUserBean() {
        return userBean;
    }

    public void setUserBean(UserBean userBean) {
        this.userBean = userBean;
    }

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String  userinfo=userBean.getUserid()+"\t"+
                userBean.getUsername()+"\t"+
                userBean.getUserage()+"\t"+
                userBean.getUseraddress();
        System.out.println("userinfo=="+userinfo);
        return null;
    }
}
<?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 id="userBean" class="com.wangxing.springboot.bean.UserBean">
        <property name="userid" value="1004"></property>
        <property name="username" value="lisi"></property>
        <property name="userage" value="24"></property>
        <property name="useraddress" value="beijing"></property>
    </bean>
    <bean  name="/test" class="com.wangxing.springboot.controller.TestController">
       <property name="userBean" ref="userBean"></property>
    </bean>
</beans>

  Spring Boot裡面沒有Spring的配置檔案,我們自己編寫的配置檔案,也不能自動識別;
  想讓Spring的配置檔案生效,載入進來;@ImportResource標註在一個主類上.

3. @Bean

  @Bean新增在方法上,告訴springIOC容器建立javabean類物件
  方法的返回值就是所要建立javabean類物件法的名稱就是javabean類物件的名稱

<bean id="物件的名稱"  class="所要建立javabean類物件"></bean>

  注意:@Bean必須出現在配置類中【@Configuration標註的java類】
  例如:

package com.wangxing.springboot.bean;
public class HelloService {
    public   void   getHelloServiceInfo(){
        System.out.println("HelloService類的測試方法");
    }
}
package com.wangxing.springboot.configuration;
import com.wangxing.springboot.bean.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//@Configuration註解標註某一個類為配置類
//代替基於XML的Spring配置檔案
@Configuration
public class MyAppConfig {
    //@Bean新增在方法上,告訴springIOC容器建立javabean類物件
    //方法的返回值就是所要建立javabean類物件
    //方法的名稱就是javabean類物件的名稱
    //<bean id="物件的名稱"  class="所要建立javabean類物件"></bean>
    @Bean
    public HelloService getHelloService(){
        return  new HelloService();
    }
}
package com.wangxing.springboot.controller;
import com.wangxing.springboot.bean.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
    @Autowired
    private HelloService  helloService;
    @RequestMapping(value = "testinfo")
    @ResponseBody
    public  String  testinfo(){
        helloService.getHelloServiceInfo();
        return "測試@Bean";
    }
}
package com.wangxing.springboot.springbootdemo7;
import com.wangxing.springboot.configuration.MyAppConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
@SpringBootApplication
@ComponentScan(basePackages = "com.wangxing.springboot.controller")
@Import(MyAppConfig.class)
public class Springbootdemo7Application {
    public static void main(String[] args) {
        SpringApplication.run(Springbootdemo7Application.class, args);
    }
}

配置檔案【application.properties】中的佔位符

  1、隨機數

${random.value}、${random.int}、${random.long} 
${random.int(10)}、${random.int[1024,65536]}

  例如:

package com.wangxing.springboot.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "student")
public class StudentBean {
    private  int  stuid;
    private  String stuname;
    private  int stuage;
    private  String  stuaddress;
    public int getStuid() {
        return stuid;
    }
    public void setStuid(int stuid) {
        this.stuid = stuid;
    }
    public String getStuname() {
        return stuname;
    }
    public void setStuname(String stuname) {
        this.stuname = stuname;
    }
    public int getStuage() {
        return stuage;
    }
    public void setStuage(int stuage) {
        this.stuage = stuage;
    }
    public String getStuaddress() {
        return stuaddress;
    }
    public void setStuaddress(String stuaddress) {
        this.stuaddress = stuaddress;
    }
}
application.properties
student.stuid=${random.int}
student.stuname=zhangsan
student.stuage=${random.int[1024,65536]}
student.stuaddress=${student.stuname}_地址
package com.wangxing.springboot.controller;
import com.wangxing.springboot.bean.StudentBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
    @Autowired
    private StudentBean studentBean;
    @RequestMapping(value = "/test")
    @ResponseBody
    public String testStudent(){
        System.out.println(studentBean.getStuid());
        System.out.println(studentBean.getStuname());
        System.out.println(studentBean.getStuage());
        System.out.println(studentBean.getStuaddress());
        return "";
    }
}

Profiles

  1. Profifile檔案就是用來配置在不同環境下的配置資料。
  2. 因為在不同的環境下配置檔案中配置的執行環境的資料是不同的,所以我們就需要靈活的在不同的執行環境下切換成對應的執行環境的資料,此時我們將不同的執行環境資料,配置到不同的配置檔案中,通過在主配置檔案application.properties中的spring.profiles.active屬性完成切換。
  測試.properties配置

application-dev.properties【開發環境配置】
server.port=8080
application-prod.properties【生產環境配置】
server.port=9090
application.properties 【主配置】
spring.profiles.active=prod 【指定使用生產環境配置】
http://localhost:9090/testInfo
或者
spring.profiles.active=dev 【指定使用開發環境配置】
http://localhost:8080/testInfo

  測試.yml配置

application-devyml.yml【開發環境配置】
server: 
port: 8080
application-prodyml.yml【生產環境配置】
server: 
port: 9090
application.yml 【主配置】
spring: 
profiles: 
active: prodyml 【指定使用生產環境配置】
http://localhost:9090/testInfo
或者
spring: 
profiles: 
active: devyml 【指定使用開發環境配置】
http://localhost:8080/testInfo

  上面是通過在1.主配置檔案中切換執行環境配置
  還可以通過配置2.執行環境引數配置檢視視窗來指定具體使用哪一個執行環境
  “–spring.profiles.active=dev“
在這裡插入圖片描述

  還可以通過3.命令列執行jar的時候指定具體使用哪一個執行環境
  java -jar testspringboot002-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
  還可以通過4.配置虛擬機器引數指定具體使用哪一個執行環境;
  “-Dspring.profiles.active=dev”
在這裡插入圖片描述

  注意:執行環境配置檔案的名稱 application-{profiles}.properties/yml

主配置檔案載入位置

  spring boot 啟動會掃描以下位置的application.properties或者 application.yml檔案作為Spring boot的預設配置檔案
– 專案根目錄/config/
– 專案根目錄/
– resource/config/
– resource:/
  以上是按照優先順序從高到低的順序,所有位置的檔案都會被載入,高優先順序配置內容會覆蓋低優先順序配置內容。
  SpringBoot會從這四個位置全部載入主配置檔案;互補配置
  我們也可以通過配置spring.config.location來改變預設配置
  專案打包好以後,我們可以使用命令列引數的形式,啟動專案的時候來指定配置檔案的新位置;指定配置檔案和預設載入的這些配置檔案共同起作用形成互補配置;

java -jar testspringboot02-0.0.1-SNAPSHOT.jar --spring.confifig.location=F:/application.properties

外部配置載入順序
  Spring Boot 支援多種外部配置方式
  1. 命令列引數
  2. 來自java:comp/env的JNDI屬性
  3. Java系統屬性(System.getProperties())
  4. 作業系統環境變數
  5. RandomValuePropertySource配置的random.*屬性值
  6. jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案
  7. jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案
  8. jar包外部的application.properties或application.yml(不帶spring.profile)配置檔案
  9. jar包內部的application.properties或application.yml(不帶spring.profile)配置檔案
  優先載入帶profifile,再來載入不帶profifile,由jar包外向jar包內進行尋找
  10. @Configuration註解類上的@PropertySource
  11. 通過SpringApplication.setDefaultProperties指定的預設屬性

相關文章