大家好,又见面了,我是你们的朋友全栈君。
定义:Spring应用引导类,提供便利的自定义行为方法 场景:嵌入式Web应用和非Web应用
BeanDefinitionLoader(BeanDefinitionRegistry registry, Object... sources) {
Assert.notNull(registry, "Registry must not be null");
Assert.notEmpty(sources, "Sources must not be empty");
this.sources = sources;
// 使用AnnotatedBeanDefinitionReader进行配置
this.annotatedReader = new AnnotatedBeanDefinitionReader(registry);
// 使用XmlBeanDefinitionReader进行配置
this.xmlReader = XML_ENABLED ? new XmlBeanDefinitionReader(registry) : null;
this.groovyReader = this.isGroovyPresent() ? new GroovyBeanDefinitionReader(registry) : null;
this.scanner = new ClassPathBeanDefinitionScanner(registry);
this.scanner.addExcludeFilter(new BeanDefinitionLoader.ClassExcludeFilter(sources));
}
static WebApplicationType deduceFromClasspath() {
// WEBFLUX_INDICATOR_CLASS = "org.springframework.web.reactive.DispatcherHandler";
// WEBMVC_INDICATOR_CLASS = "org.springframework.web.servlet.DispatcherServlet";
// JERSEY_INDICATOR_CLASS = "org.glassfish.jersey.servlet.ServletContainer";
// 如果没有上面的方式,默认使用Servlet_indicator_classes,如果共存的情况下优先使用Servlet_indicator_classes
if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {
return WebApplicationType.REACTIVE;
}
for (String className : SERVLET_INDICATOR_CLASSES) {
if (!ClassUtils.isPresent(className, null)) {
return WebApplicationType.NONE;
}
}
return WebApplicationType.SERVLET;
}
可以在引导类中指定引导的具体类型
/**
* {@link SpringApplication} 引导类
*/
public class SpringApplicationBootstrap {
public static void main(String[] args) {
// 交给其运行的类只要上面有@SpringBootApplicat ion注解就行,不一定是主类名
// SpringApplication.run(ApplicationConfiguration.class, args);
HashSet<String> set = new HashSet<>();
set.add(ApplicationConfiguration.class.getName());
SpringApplication springApplication = new SpringApplication();
springApplication.setSources(set);
// 默认为Servlet类型,此处对它进行强制关闭,变成普通类型--主线程会中断[非web容器], web容器主线程会阻塞等待请求
springApplication.setWebApplicationType(WebApplicationType.NONE);
ConfigurableApplicationContext context = springApplication.run(args);
// 反射EnhancerBySpringCGLIB
// com.SpringBoot.study.SpringApplicationBootstrap$ApplicationConfiguration$$EnhancerBySpringCGLIB$$ea8d68dc@400d912a
System.out.println(context.getBean(ApplicationConfiguration.class));
}
@SpringBootApplication
public static class ApplicationConfiguration{
}
}
加载:应用上下文初始化器 和 应用事件监听器
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
this.bootstrappers = new ArrayList<>(getSpringFactoriesInstances(Bootstrapper.class));
// 上下文初始化器
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
// 监听器
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
《慕课网–深入Spring Boot2.0》
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/195421.html原文链接:https://javaforall.cn