使用@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。

推薦閱讀: