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