参考文章
springboot手动动态注入controller和service
Spring Boot - 获取所有的Bean信息
前言
本人小白,最近想有一个想法,想利用载入jar包形式去更新api,热加载注册使用第三方springboot jar包service、controller,经过多方查询和测试验证,已经简单完成基础功能,下面贴出部分主要代码,望各位大佬多加指点,这个方法是否妥当
源代码获取:
Code China
CSDN
蓝奏云
代码
主要代码
- springContextUtil.java:设置、获取ApplicationContext
package chen.wset.utils;
import org.springframework.context.ApplicationContext;
public class springContextUtil {
private static ApplicationContext applicationContext;
//获取上下文
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//设置上下文
public static void setApplicationContext(ApplicationContext applicationContext) {
springContextUtil.applicationContext = applicationContext;
}
}
- WsetApplication.java:设置springContextUtil.java中的ApplicationContext
这个是所有springboot初始的SpringBootApplication文件,一般是目录最外面XXXApplication.java那个文件,不需要自己创建,修改一下代码就可以了。
package chen.wset;
import chen.wset.utils.springContextUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class WsetApplication {
public static void main(String[] args) {
ApplicationContext app = SpringApplication.run(WsetApplication.class, args);
springContextUtil.setApplicationContext(app);
}
}
- registerApplication.java:注册、卸载、获取Bean,Controller操作
package chen.wset.utils;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class registerApplication {
// 获取ApplicationContext
private ApplicationContext applicationContext = springContextUtil.getApplicationContext();
//将applicationContext转换为ConfigurableApplicationContext
private ConfigurableApplicationContext configurableApplicationContext =
(ConfigurableApplicationContext) applicationContext;
// 获取bean工厂并转换为DefaultListableBeanFactory
private DefaultListableBeanFactory defaultListableBeanFactory =
(DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
public registerApplication() {
}
/**
* 注册bean
* @param className
* @throws Exception
*/
public void registerBean(String className) throws Exception {
//获取class
Class reclass = Class.forName(className);
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(reclass)