大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
SpringApplication
定义:Spring应用引导类,提供便利的自定义行为方法
场景:嵌入式Web应用和非Web应用
准备阶段
- 配置:Spring Bean来源
- Java配置Class:Spring注解驱动中Java配置类,大多是情况下是Spring 模式注解锁标注的类,如被@configuration标注的类
- XML上下文配置文件:用于Spring 传统配置驱动中的xml文件
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));
}
- 推断:Web应用类型 和 主引导类(Main Class)
- Web Reactive:webApplicaitonType.REACTIVE
- Web Servlet:webApplicaitonType.SERVLET
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(); }
- 上下文初始化器技术
- 实现类:org.springframework.core.io.support.SpringFactoriesLoader
- 配置资源:META-INF/spring.factories
- 排序:AnnotationAwareOrder
- 上下文初始化器技术
《慕课网–深入Spring Boot2.0》
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195421.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...