测试代码

This commit is contained in:
troy.chen
2024-02-19 21:32:36 +08:00
parent f3b3c4543b
commit 6212c3ab07
8 changed files with 326 additions and 27 deletions

View File

@@ -0,0 +1,24 @@
package scripts;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletRegistration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.servlet.DispatcherServlet;
@Configuration
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
System.out.println("------------111111--------");
// 创建DispatcherServlet的实例
DispatcherServlet dispatcherServlet = new DispatcherServlet();
// 设置servlet映射
ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcher", dispatcherServlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}

View File

@@ -9,16 +9,17 @@ import org.springframework.web.servlet.DispatcherServlet;
@Configuration
public class ScriptConfig {
@Bean
public ServletRegistrationBean resourceServlet(ApplicationContext applicationContext) {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setApplicationContext(applicationContext);
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet);
//指定urlmapping
servletRegistrationBean.addUrlMappings("/test");
servletRegistrationBean.setLoadOnStartup(1);
servletRegistrationBean.setName("resource");
return servletRegistrationBean;
}
// @Bean
// public ServletRegistrationBean resourceServlet(ApplicationContext applicationContext) {
// System.out.println("init resourceServlet");
// DispatcherServlet dispatcherServlet = new DispatcherServlet();
// dispatcherServlet.setApplicationContext(applicationContext);
// ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet);
// //指定urlmapping
// servletRegistrationBean.addUrlMappings("/test");
// servletRegistrationBean.setLoadOnStartup(1);
// servletRegistrationBean.setName("resource");
// return servletRegistrationBean;
// }
}

View File

@@ -1,29 +1,78 @@
package scripts;
import org.example.HelloController;
import org.example.Main;
import org.example.SpringAnnotationUtils;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.wxd.boot.agent.loader.ClassDirLoader;
import org.wxd.boot.agent.system.ReflectContext;
import java.util.Map;
import java.util.HashSet;
import java.util.Set;
public class ScriptMain {
static AnnotationConfigApplicationContext childContainer;
public static void scriptInit(ConfigurableApplicationContext context) {
public static void scriptInit(ConfigurableApplicationContext context, ClassDirLoader classDirLoader) {
//子容器
childContainer = new AnnotationConfigApplicationContext("scripts");
childContainer = new AnnotationConfigApplicationContext();
childContainer.setParent(context);
childContainer.setClassLoader(classDirLoader);
childContainer.scan(ScriptMain.class.getPackageName());
childContainer.refresh();
// scriptInit0(context, classDirLoader);
//从子容器中获取父容器中的Bean
HelloController parentService = childContainer.getBean(HelloController.class);
LoggerFactory.getLogger(Main.class).info("{}", parentService);
LoggerFactory.getLogger(ScriptMain.class).info("{}", parentService);
//getBeansOfType无法获取到父容器中的Bean
Map<String, TestApi> map = childContainer.getBeansOfType(TestApi.class);
map.forEach((k, v) -> LoggerFactory.getLogger(Main.class).info("{} => {}", k, v));
childContainer.getBeansOfType(TestApi.class).forEach((k, v) -> {
LoggerFactory.getLogger(ScriptMain.class).info("{}", v);
});
System.out.println("http://127.0.0.1:18081/test");
}
public static void scriptInit0(ConfigurableApplicationContext context, ClassDirLoader classDirLoader) {
Set<Class<?>> initBeanClass = new HashSet<>();
ReflectContext reflectContext = ReflectContext.Builder.of(classDirLoader, ScriptMain.class.getPackageName()).build();
// 获取beanFactory
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();
reflectContext.classStream().forEach(clazz -> {
final String className = clazz.getName();
// 2. 将有@spring注解的类交给spring管理
// 2.1 判断是否注入spring
boolean flag = SpringAnnotationUtils.hasSpringAnnotation(clazz);
if (flag) {
// 2.2交给spring管理
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
// 此处beanName使用全路径名是为了防止beanName重复
String packageName = className.substring(0, className.lastIndexOf(".") + 1);
String beanName = className.substring(className.lastIndexOf(".") + 1);
beanName = packageName + beanName.substring(0, 1).toLowerCase() + beanName.substring(1);
// 2.3注册到spring的beanFactory中
beanFactory.registerBeanDefinition(beanName, beanDefinition);
// 2.4允许注入和反向注入
beanFactory.autowireBean(clazz);
beanFactory.initializeBean(clazz, beanName);
/*if(Arrays.stream(clazz.getInterfaces()).collect(Collectors.toSet()).contains(InitializingBean.class)){
initBeanClass.add(clazz);
}*/
initBeanClass.add(clazz);
System.out.println(clazz.getName());
}
});
}
}