您好,登錄后才能下訂單哦!
本篇文章為大家展示了使用springboot怎么實現環境抽象,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
springboot一種全新的編程規范,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程,SpringBoot也是一個服務于框架的框架,服務范圍是簡化配置文件。
@Profile
基于Java類的環境配置
@Profile注解可以用來標注@Configuration注解的類。表示該特定環境下激活該類下的所有bean。當然也可以專門用來標注@Bean,因為許多時候本地環境和Production環境的區別只是數據源不同罷了。
@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
現在我們已經更新了我們的配置,我們仍然需要說明哪個profile是激活的。如果直接注冊@Configuration標注的類,這將會看到一個NoSuchBeanDefinitionException被拋出,因為容器找不到一個對應的環境下的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是激活狀態,上面的bean將會被創建;這種方式可以被看做是對一個或者多個bean提供了一種默認的定義方式。如果啟用任何的profile,那么默認的profile都不會被應用。
屬性源抽象
Spring 環境抽象提供了可配置的屬性源層次結構的搜索操作。
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的兩個系統變量以及環境變量。
一個PropertySource是對任何key-value資源的簡單抽象,并且Spring 的標準環境是由兩個PropertySource配置的,一個表示一系列的JVM 系統屬性(System.getProperties()),一個表示一系列的系統環境變量(System.getenv())。
具體的說,當使用StandardEnvironment時,如果在運行時系統屬性或者環境變量中包括foo,那么調用env.containsProperty(“java.vm.version”)方法將會返回true。
更重要的是,整個機制都是可配置的。也許你有個自定義的屬性來源,你想把它集成到這個搜索里面。這也沒問題,只需簡單的實現和實例化自己的PropertySource,并把它添加到當前環境的PropertySources集合中:
ConfigurableApplicationContext ctx = new GenericApplicationContext(); MutablePropertySources sources = ctx.getEnvironment().getPropertySources(); sources.addFirst(new MyPropertySource());
@PropertySource
上一篇文章講到,基于Java的配置很多時候會和xml混合使用。其中@Import還可以導入其他Java配置類,這里要說的@PropertySource注解表示導入.properties文件。
@Configuration @PropertySource("classpath:user.properties") public class UserConf { @Autowired Environment environment; @Bean //每次調用就創建一個新的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
任何出現在@PropertySource中的資源位置占位符都會被注冊在環境變量中的資源解析。
假設”user.name”已經在其中的一個資源中被注冊,例如:系統屬性或環境變量,占位符將會被正確的值解析。
如果沒有,”default/path”將會使用默認值。如果沒有默認值,而且無法解釋屬性,則拋出IllegalArgumentException異常。
上述內容就是使用springboot怎么實現環境抽象,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。