翻译:吴嘉俊,叩丁狼高级讲师。
众所周知,软件开发是一个协同的活动。开发中的整合工作往往都被视为邪恶的,开发人员会像魔鬼一样对待这个过程。为了应付这种情况,有非常多的方法和规则被开发出来。特征切换就是其中之一。在本文中,你将会看到什么是特征切换,了解特征标记,以及如何在你的Springboot应用中使用。
什么是特征切换
简单来说,特征切换是控制程序按照某种流程执行的一个变量开关。不用修改代码,就能切换到不同的执行场景的方式。
根据自身需求,用于特征切换的变量值可以在应用启动的时候就设置好,或者在运行期间根据需要进行调整。针对后一种情况,只需要把特征切换变量值持久化下来,在实际运行的时候去获取即可。
你应该了解过特征标志的另一种实现方案:按照特征代码分支。在实际的开发中,这两种技术可以组合起来使用。比如,针对一个新的用户故事(User Story),可以使用特征分支,同时,也可以使用特征切换来控制在针对不同的场景的用户需求。
不过,虽然特征切换有很多适用场景,但是它仍然有自己的缺点。最大的一个问题就在于它的复杂性。如果没有一个良好的管理策略,特征切换会很容易失去控制,变成项目的一个噩梦。幸运的是,如果你遵循几个最佳实践,使用特征切换会变得非常容易。
使用特征切换来选择合适的Bean
在Springboot的应用中,使用特征切换最常见的场景是,给定一个接口,根据特征值切换到一个不同的实现类。我们来简单看下这种场景:
考虑一个场景:在一个web服务端中,提供了从数据库中筛选一个货品列表的功能。你现在的目标就是创建一个特征切换,允许动态的选择不同的数据库源提供给web服务。
想要使用特征切换,第一个要做的事情,就是把提供给其他类使用的依赖,使用接口抽象。
下面的代码展示了一个商品的REST接口,依赖于ProductRepository接口:
@RestController
@RequestMapping("/products")
class ProductController {
private final ProductRepository productRepository;
ProductController(ProductRepository productRepository) {
this.productRepository = productRepository;
}
@GetMapping
Collection<Product> getAll() {
return productRepository.findAll();
}
}
目前,我们只有一个ProductRepository的实现,接下来,当我们要添加另一个ProductRepository实现的时候,我们就需要考虑特征切换了。