场景复现
举个例子,针对不同的设备的内存的不同加载一些资源的时候需要采取不同的策略,比如,在内存比较大的设备,可以一次性加载,繁殖需要使用懒加载,这个时候我们就可以采用配置文件+配置中心去控制了
@ConditionalOnProperty
@ConditionalOnProperty是Spring Boot中的一个注解,它可以用来控制某个Bean的创建和激活。它的作用是通过读取配置文件中的属性值来决定是否创建或激活某个Bean。当配置文件中的属性值与@ConditionalOnProperty的要求相符时,才会创建或激活该Bean。
@ConditionalOnProperty有以下几个参数:
- name:要检查的属性的名称;
- havingValue:要检查的属性的值;
- matchIfMissing:如果配置文件中没有该属性,是否匹配。
代码
策略类的父接口
public interface LoadModelStrategy {void loadModel(List<Speaker> speakers);
}
策略类抽象类
public abstract class AbstractLoadModelStrategy implements LoadModelStrategy{public static boolean checkFileExist(String filePath) {return new File(filePath).exists();}
}
实现类
@Slf4j
public class LazyLoadModelStrategy extends AbstractLoadModelStrategy{@Overridepublic void loadModel(List<Speaker> speakers) {log.info("懒加载");}
}
@Slf4j
public class PreloadedLoadModelStrategy extends AbstractLoadModelStrategy {@Overridepublic void loadModel(List<Speaker> speakers) {log.info("立即加载");}
}
配置类
@Configuration
public class LoadModelConfig {@Bean@ConditionalOnProperty(name = "test.strategy",havingValue = "lazy")public LoadModelStrategy lazyLoadModelStrategy(){return new LazyLoadModelStrategy();}@Bean@ConditionalOnProperty(name = "test.strategy",havingValue = "preloaded")public LoadModelStrategy preloadedLoadModelStrategy(){return new PreloadedLoadModelStrategy();}
}
配置文件
test:strategy: preloaded
消费者
@Slf4j
@Component
@ConfigurationProperties(prefix = "test")
public class InitConfig implements CommandLineRunner {@Resourceprivate LoadModelStrategy loadModelStrategy;// 执行初始化逻辑@Overridepublic void run(String... args) throws Exception {log.info("进入初始化方法");log.info("loadModelStrategy:{}", loadModelStrategy);}
}