springmvc动态注册controller

@RestController

@ConditionalOnMissingBean(SysFileApi.class)

public class SysFileApi{

// ...

}

大概想实现这样的功能,如果存在SysFileApi的bean,那不注册为Controller,如果不存在,RestController生效,注册controller

当然这样的代码并不生效,@ConditionalOnMissingBean 貌似只能对@Bean注释的方法起作用,我表达的意思是这样。能实现类似的功能就好,不局限。有什么办法可以实现这样的功能吗。


回答:

看了下包扫描的逻辑,他做了condition的匹配,看起来没起作用,只是BeanDefinition被添加到容器的先后顺序,导致看起来condition失效罢了,你调整配置类的先后顺序,让SysFileApi先于controller被添加到容器就行了

非要自己搞的话,也不是不行,实现BeanDefinitionRegistryPostProcessor,你自己写逻辑去做包扫描,这样会不会添加到容器,全由你自己决定,不注入到容器,自然不会注册controller(ps:还是有先后顺序的问题,如果代码走到自己实现的BeanDefinitionRegistryPostProcessor的时候,SysFileApi还没被添加到容器,你还是无法做判断的 - -)


回答:

@SpringBootApplication

/*package org.example.a*/

public class DemoApplication {

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

@Component

@ConditionalOnBean(ApiBean.class)

@ComponentScan(basePackages = {"org.example.b"})

static class ControllerCond {

}

static class ApiBean {

}

}

给你个思路你的正常代码放到org.example.a包下,一些动态的代码放到org.example.b下

以上是 springmvc动态注册controller 的全部内容, 来源链接: utcz.com/p/944434.html

回到顶部