SpringBoot动态控制指定的控制器类生效

使用一个属性值或变量来控制 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 注解的效果无法控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值