溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用springboot怎么實現(xiàn)環(huán)境抽象

發(fā)布時間:2021-04-20 16:43:28 來源:億速云 閱讀:135 作者:Leah 欄目:編程語言

本篇文章為大家展示了使用springboot怎么實現(xiàn)環(huán)境抽象,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

springboot是什么

springboot一種全新的編程規(guī)范,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,SpringBoot也是一個服務(wù)于框架的框架,服務(wù)范圍是簡化配置文件。

@Profile

基于Java類的環(huán)境配置

@Profile注解可以用來標(biāo)注@Configuration注解的類。表示該特定環(huán)境下激活該類下的所有bean。當(dāng)然也可以專門用來標(biāo)注@Bean,因為許多時候本地環(huán)境和Production環(huán)境的區(qū)別只是數(shù)據(jù)源不同罷了。

@Configuration
public class ProfileConf {


  @Bean
  @Profile("dev")
  public UserInfo devUserInfo() {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(1);
    userInfo.setName("dev");
    return userInfo;
  }

  @Bean
  @Profile("production")
  public UserInfo productionUserInfo() {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(1);
    userInfo.setName("production");
    return userInfo;
  }
}

激活profile

現(xiàn)在我們已經(jīng)更新了我們的配置,我們?nèi)匀恍枰f明哪個profile是激活的。如果直接注冊@Configuration標(biāo)注的類,這將會看到一個NoSuchBeanDefinitionException被拋出,因為容器找不到一個對應(yīng)的環(huán)境下的bean。

  public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    context.getEnvironment().setActiveProfiles("dev");
    context.register(UserConf.class);
    context.refresh();
    System.out.println(context.getBean(UserInfo.class));
  }

默認的profile

默認配置文件表示默認啟用的配置文件。

  @Bean
  @Profile("default")
  public UserInfo defaultUserInfo() {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(1);
    userInfo.setName("default");
    return userInfo;
  }

如果沒有profile是激活狀態(tài),上面的bean將會被創(chuàng)建;這種方式可以被看做是對一個或者多個bean提供了一種默認的定義方式。如果啟用任何的profile,那么默認的profile都不會被應(yīng)用。

屬性源抽象

Spring 環(huán)境抽象提供了可配置的屬性源層次結(jié)構(gòu)的搜索操作。

  public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//    context.getEnvironment().setActiveProfiles("dev");
    context.getEnvironment().setActiveProfiles("dev");
    context.register(ProfileConf.class);
    context.refresh();
    ConfigurableEnvironment environment = context.getEnvironment();
    Map<String, Object> maps = environment.getSystemProperties();
    maps.keySet().forEach(k -> System.out.println(k + "->" + maps.get(k)));

    System.out.println("===========================");
    Map<String, Object> environment1 = environment.getSystemEnvironment();
    environment1.keySet().forEach(k -> System.out.println(k + "->" + environment1.get(k)));

    System.out.println(environment.containsProperty("java.vm.version"));
  }

在上面的例子中可以獲取Environment的兩個系統(tǒng)變量以及環(huán)境變量。

一個PropertySource是對任何key-value資源的簡單抽象,并且Spring 的標(biāo)準(zhǔn)環(huán)境是由兩個PropertySource配置的,一個表示一系列的JVM 系統(tǒng)屬性(System.getProperties()),一個表示一系列的系統(tǒng)環(huán)境變量(System.getenv())。

具體的說,當(dāng)使用StandardEnvironment時,如果在運行時系統(tǒng)屬性或者環(huán)境變量中包括foo,那么調(diào)用env.containsProperty(“java.vm.version”)方法將會返回true。

更重要的是,整個機制都是可配置的。也許你有個自定義的屬性來源,你想把它集成到這個搜索里面。這也沒問題,只需簡單的實現(xiàn)和實例化自己的PropertySource,并把它添加到當(dāng)前環(huán)境的PropertySources集合中:

  ConfigurableApplicationContext ctx = new GenericApplicationContext();
  MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
  sources.addFirst(new MyPropertySource());

@PropertySource

上一篇文章講到,基于Java的配置很多時候會和xml混合使用。其中@Import還可以導(dǎo)入其他Java配置類,這里要說的@PropertySource注解表示導(dǎo)入.properties文件。

@Configuration
@PropertySource("classpath:user.properties")
public class UserConf {

  @Autowired
  Environment environment;

  @Bean
  //每次調(diào)用就創(chuàng)建一個新的bean
  @Scope("prototype")
  public UserInfo userInfo() {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(Integer.valueOf(environment.getProperty("user.id")));
    System.out.println(environment.getProperty("user.name"));
    userInfo.setName(environment.getProperty("user.name"));
    return userInfo;
  }
}
user.id=11
user.name=asdasd

任何出現(xiàn)在@PropertySource中的資源位置占位符都會被注冊在環(huán)境變量中的資源解析。

假設(shè)”user.name”已經(jīng)在其中的一個資源中被注冊,例如:系統(tǒng)屬性或環(huán)境變量,占位符將會被正確的值解析。

如果沒有,”default/path”將會使用默認值。如果沒有默認值,而且無法解釋屬性,則拋出IllegalArgumentException異常。

上述內(nèi)容就是使用springboot怎么實現(xiàn)環(huán)境抽象,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI