spring 启用/禁用服务最佳实践

idfiyjo8  于 2023-05-05  发布在  Spring
关注(0)|答案(1)|浏览(137)

假设我们有ServiceA,它应该在某些配置文件中工作,但被禁用(即调用该服务不应做任何事情)。我认为有两种方法可以实现它:

  • 具有isEnabled性质

那么实现可能是

public class ServiceA {
    @Value("${isEnabled:true}")
    private final boolean isEnabled;

    public do() {
      if (!isEnabled) return;
      ...
    }
}

这里的缺点是它有点打破了单一责任原则,而且如果我们有很多方法,它们都应该有if(!isEnabled)

  • 利用条件注解

这里我们需要ServiceA和2实现的接口:NoOpServiceA(空实现)和RealServiceA都有@ConditionalOnProperty(name = "isEnabled", ...)。这样就不会有if的内部方法,出错的机会也会减少,另一方面,它会创建很多额外的类,并可能妨碍代码的可理解性。
你会选择什么,或者有更好的方法吗?

cs7cruho

cs7cruho1#

我不确定这是否能帮助你实现你想要的,但我做了这样的事情来启用/禁用我的RestController

@RestController
 @ConditionalOnExpression("${personcontroller.enabled:false}")
 @RequestMapping(value = "temp", produces = "application/json;charset=UTF- 8")
 public class PersonController {
    @RequestMapping(value = "test")
    public ResponseEntity<String> getData() {
      return new ResponseEntity<>("Hello world", HttpStatus.OK);
    } 
 }

加上这个注解,除非我有

personcontroller.enabled=true

在我的application.properties文件中,控制器根本无法启动。
P.S:你可能想考虑@ConditionalOnProperty,因为它被认为是稍微快一点。
希望它能以某种方式帮助你。

相关问题