使用一个属性值或变量来控制 SpringBoot 中指定 @RestController 注解标注的类生效。

首先自定义一个配置类,并在这个类中将使用 @RestController 注解的控制器类注入到 Spring 容器中。

然后再在这个配置类中添加一个 @ConditionalOnProperty 注解,并在这个注解中指定一个属性名和一个属性值,用来控制是否要将这些注解的类注入到 Spring 容器中。

示例代码:

@Configuration
public class WebAutoConfiguration {

    @Bean
    @ConditionalOnProperty(name = "myapp.service.enabled", havingValue = "true")
    public MyService myService() {

        return new MyService();
    }

    @Bean
    @ConditionalOnBean(MyService.class)
    // 由于是依赖问题,两者二选一
    // @ConditionalOnProperty(name = "myapp.controller.enabled", havingValue = "true")
    public MyRestController myRestController(MyService myService) {

        return new MyRestController(myService);
    }
}

说明:在上面的示例中

@ConditionalOnBean:表示仅当应用程序上下文中存在 MyService 这个 Bean 时,才会创建 MyRestController 这个 Bean。这个 Bean 的创建需要依赖于 MyService,因此使用了构造函数注入的方式来注入 MyService。

如果应用程序上下文中不存在 MyService,则不会创建 MyRestController Bean。

@ConditionalOnProperty:表示当指定的属性值为 true 时,才会创建  MyRestController 这个 Bean。

  • name:指定了一个名称为 myapp.xxx.enabled 的属性,这个属性用来控制 @RestController 注解是否生效。
  • havingValue:指定了属性的值必须为 true,才会将 MyRestController 这个类注入到 Spring 容器中。

由于 MyService 和 MyRestController  是依赖关系,两者二选其一就可以。

示例代码:

@RestController
@ConditionalOnMissingBean(MyRestController.class)
@AllArgsConstructor
@RequestMapping("/api/myRestController")
public class MyRestController {

    private MyService myService;

    @GetMapping("/hello")
    public String hello() {

        return myService.demo();
    }
}

说明:如果你想要禁用指定使用 @RestController 注解的控制器,你只需要在 application.properties 文件中设置 myapp.xxx.enabled 即可。

如果你想要启用这些控制器,只需要将属性设置为 true 即可。

注意:如果你禁用了指定使用 @RestController 注解的控制器,这些控制器将会被从 Spring 容器中移除,不能使用。而且,这个方法只适用于控制器的生效,但是对于自动装配类中使用的 @RestController 注解的效果无法控制。