java - 如何动态加载Spring Controller

标签 java spring spring-boot

我有一个托管 REST API 的 Spring Boot 应用程序。

根据部署的文件,我希望能够从本质上是“插件”JAR 文件加载其他 Controller 。

例如,我希望能够做这样的事情:

java -jar myapp.jar -Dplugins.directory=/opt/myapp/plugins

这可能吗?

注意:这些不会即时加载;一旦部署,插件集将保持固定。我希望有一个应用程序 jar 在每次部署中都保持不变,并且应用程序的行为将由与其一起部署的插件决定。

最佳答案

它可能不能100%满足您的需求。 我有两个建议。

简单的一个。 java -jar stackoverflow-1.0-SNAPSHOT.jar --spring.profiles.active=prod 并在您的 Controller 上放置不同的值“@Profile”。

@RestController
@Profile("prod")
public class URLOneController {

@PostMapping(value = "/url", consumes="application/json", produces="application/json")
public ResponseEntity<HttpStatus> insertClaim(@RequestBody String messageBody) {
    return new ResponseEntity<>(HttpStatus.OK);
}

}
<小时/>

第二个建议,动态加载beanDefiniton。

@Configuration
@ConditionalOnProperty(name="external.controller.enable",havingValue = "true")
public class ExternalClassDefinitionProcessor  implements 
BeanDefinitionRegistryPostProcessor {

@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();


    Class<?> aClass = null;
    try {
        aClass = contextClassLoader.loadClass("com.jin.learn.demo.UrlOneController");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
            .genericBeanDefinition(aClass);

    beanDefinitionBuilder.addPropertyReference("personDao", "personDao");

    BeanDefinition personManagerBeanDefinition = beanDefinitionBuilder
            .getRawBeanDefinition();
    registry.registerBeanDefinition("UrlOneController", 
personManagerBeanDefinition);

}

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory 
beanFactory) throws BeansException {

   }
}

将 Controller 打包到普通 jar 中(不使用 spring-boot-maven-plugin )

像这样的命令行运行你的应用程序

java -Dloader.path="lib/,config/,/home/jin/Desktop/abc/target/abc-1.0-SNAPSHOT.jar" -jar stackoverflow-1.0-SNAPSHOT.jar --external.controller.enable=true

abc-1.0-SNAPSHOT.jar 中的额外 Controller 和您的主应用程序是 stackoverflow-1.0-SNAPSHOT.jar

提示: stackoverflow-1.0-SNAPSHOT.jar 应打包为 zip 格式。

<plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layout>ZIP</layout>
            </configuration>
        </plugin>

关于java - 如何动态加载Spring Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262808/

相关文章:

java - 检索在运行时执行 java.security.PrivilegedAction 的 Subject

java - Spring - 多个方面乱序触发

java - 如何在Spring boot中加载没有任何文件扩展名的配置文件

java - 使用 log4j 进行 Spring Boot 日志记录 - 如何启用 Spring Boot 日志条目?

java - 使用 Spring Boot : Could not resolve placeholder 进行 Maven 资源过滤

Java:构造函数不返回。但它确实如此吗?

java - JavaEE 中的购物车困境

java - html 文件中的 Thymeleaf 命名空间在 Netbeans 中显示错误 - 如何让它通过 HTML 检查?

Spring MVC 为 root 提供 404

java - 如何将ByteArrayRawSerializer的messageSize设置为无限制?