使用@ConditionalOnProperty控制是否加載的操作
@ConditionalOnProperty控制是否加載
public interface OSService { void os(); } @ConditionalOnProperty(prefix = "custom.os", name = "name", havingValue = "linux") @Service("osService") public class LinuxService implements OSService { @Override public void os() { System.out.println("Now OS is Linux!"); } } @ConditionalOnProperty(prefix = "custom.os", name = "name", havingValue = "windows") @Service("osService") public class WindowsService implements OSService { @Override public void os() { System.out.println("Now OS is Windows!"); } } @RequestMapping(path = "test") @RestController public class TempRestController { @Autowired OSService osService; @PostMapping(path = "condition") public void condition() { osService.os(); } }
配置文件 application.yml:
custom: os: name: linux
@ConditionalOnProperty的作用及用法
在spring boot中有時候需要控制配置類是否生效,可以使用@ConditionalOnProperty註解來控制@Configuration是否生效。
配置類代碼:
@Configuration @ConditionalOnProperty(prefix = "filter",name = "loginFilter",havingValue = "true") public class FilterConfig { //prefix為配置文件中的前綴, //name為配置的名字 //havingValue是與配置的值對比值,當兩個值相同返回true,配置類生效. @Bean public FilterRegistrationBean getFilterRegistration() { FilterRegistrationBean filterRegistration = new FilterRegistrationBean(new LoginFilter()); filterRegistration.addUrlPatterns("/*"); return filterRegistration; } }
配置文件中的代碼
filter.loginFilter=true
測試
當配置文件中值為true時:輸出瞭”過濾器”三個字,說明loginFilter生效瞭,說明配置類生效瞭。
當配置文件中值為false時:沒有輸出瞭”過濾器”三個字,說明loginFilter沒有生效,說明配置類沒有生效。
總結:
通過@ConditionalOnProperty控制配置類是否生效,可以將配置與代碼進行分離,實現瞭更好的控制配置。
@ConditionalOnProperty實現是通過havingValue與配置文件中的值對比,返回為true則配置類生效,反之失效。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot使用@EnableAutoConfiguration實現自動配置詳解
- springboot接口多實現類選擇性註入解決方案
- SpringBoot 自動配置失效的解決方法
- Spring @Conditional註解示例詳細講解
- Spring Boot 條件註解詳情