Spring: bean、rest-controller等的动态注册



我是Spring的新手,想将我现有的应用程序转换为Spring Boot。

然而,我正在使用一个自编写的模块框架,它允许我在运行时动态地添加或删除组件或应用程序的附加功能。整个东西可以与插件框架(如PF4J)或Minecraft服务器中的插件机制进行比较。

这样做的好处是显而易见的。应用程序更加动态,程序的某些部分可以在运行时更新,而不必重新启动整个应用程序。

在底层,当每个模块被加载时,会为它创建一个新的ClassLoader。这个ClassLoader的ClassPath包含模块的JAR文件。之后,我用这个ClassLoader加载相应的类,并在其中执行一个init方法,其中包含每个模块。

现在,我当然想与Spring连接,模块函数中的依赖注入,以及模块中的bean或例如rest控制器,在模块加载时注册,在模块卸载时注销。

示例:我有一个员工模块。当我注册它时,雇员端点已经注册并且可以使用。当我卸载模块时,雇员端点再次被删除。

现在我的问题:
不幸的是,我不知道如何在Spring中实现这个,或者如果这样的事情在Spring中甚至是可能的。或者已经有其他解决方案了吗?

我也读了一些关于应用程序上下文的东西。我是否必须为每个模块创建一个新的应用程序上下文,然后以某种方式"关闭"它?什么时候卸载模块?

我希望你能帮助我,也与代码示例。

这个帖子帮了我一点忙:https://hdpe.me/post/modular-architecture-with-spring-boot/

简而言之,为每个模块创建一个新的ApplicationContext(例如AnnotationConfigApplicationContext)。如果你想在模块之间共享bean,你必须将它们发布到主应用程序上下文中。

bean可以在运行时由((GenericApplicationContext) applicationContext).registerBeanDefinition(name, beanDefinition);在主应用程序上下文注册。

另一个问题是需要额外的配置,例如@RestController或类似的,为了使它们工作。请参阅我在StackOverFlow上的其他问题。

最新更新