1.这2天学了一下spring boot,为了扫盲spring cloud,记录学习心得。
2. 第一天简单回答几个问题:
(1)spring boot是如何内嵌tomcat容器的。
解答:这个我没看代码也大概猜到了,因为以前看ClassPathXmlApplicationContext源码的时候,AbstractApplicationContext的refresh()方法是有很多预留的扩展方法的,不出所料,spring boot正式通过AnnotationConfigEmbeddedWebApplicationContext类实现onRefresh()的方式内嵌tomcat容器的
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
AnnotationConfigEmbeddedWebApplicationContext类实现onRefresh(),默认取得是TomcatEmbeddedServletContainer,可以切换到jetty 。
@Override
protected void onRefresh() {
super.onRefresh();
try {
createEmbeddedServletContainer();
}
catch (Throwable ex) {
throw new ApplicationContextException("Unable to start embedded container",
ex);
}
}
/**
* Create a new {@link TomcatEmbeddedServletContainer} instance.
* @param tomcat the underlying Tomcat server
* @param autoStart if the server should be started
*/
public TomcatEmbeddedServletContainer(Tomcat tomcat, boolean autoStart) {
Assert.notNull(tomcat, "Tomcat Server must not be null");
this.tomcat = tomcat;
this.autoStart = autoStart;
initialize();
}
private synchronized void initialize() throws EmbeddedServletContainerException {
TomcatEmbeddedServletContainer.logger
.info("Tomcat initialized with port(s): " + getPortsDescription(false));
try {
addInstanceIdToEngineName();
// Remove service connectors to that protocol binding doesn't happen yet
removeServiceConnectors();
// Start the server to trigger initialization listeners
this.tomcat.start();
// We can re-throw failure exception directly in the main thread
rethrowDeferredStartupExceptions();
// Unlike Jetty, all Tomcat threads are daemon threads. We create a
// blocking non-daemon to stop immediate shutdown
startDaemonAwaitThread();
}
catch (Exception ex) {
throw new EmbeddedServletContainerException("Unable to start embedded Tomcat",
ex);
}
}
切换到jetty也很简单:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除默认的tomcat,引入jetty容器. -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- jetty 容器. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
(2)spring boot是如何注册bean到容器里面的:
解答:一般情况下,DefaultListableBeanFactory或者ClassPathXmlApplicationContext注册bean到容器都是通过解析XML默认标签和自定义标签的方式注册bean到容器里面的,最终存到DefaultListableBeanFactory的Map<String, BeanDefinition> beanDefinitionMap =new ConcurrentHashMap<String, BeanDefinition>(256);对象中的,而springboot是通过
"org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext"注册bean到容器中的,具体源码如下:
核心代码: load(context, sources.toArray(new Object[sources.size()]));
private ConfigurableApplicationContext createAndRefreshContext(
SpringApplicationRunListeners listeners,
ApplicationArguments applicationArguments) {
ConfigurableApplicationContext context;
// Create and configure the environment
ConfigurableEnvironment environment = getOrCreateEnvironment();
configureEnvironment(environment, applicationArguments.getSourceArgs());
listeners.environmentPrepared(environment);
if (isWebEnvironment(environment) && !this.webEnvironment) {
environment = convertToStandardEnvironment(environment);
}
if (this.bannerMode != Banner.Mode.OFF) {
printBanner(environment);
}
// Create, load, refresh and run the ApplicationContext
context = createApplicationContext();
context.setEnvironment(environment);
postProcessApplicationContext(context);
applyInitializers(context);
listeners.contextPrepared(context);
if (this.logStartupInfo) {
logStartupInfo(context.getParent() == null);
logStartupProfileInfo(context);
}
// Add boot specific singleton beans
context.getBeanFactory().registerSingleton("springApplicationArguments",
applicationArguments);
// Load the sources
Set<Object> sources = getSources();
Assert.notEmpty(sources, "Sources must not be empty");
load(context, sources.toArray(new Object[sources.size()]));
listeners.contextLoaded(context);
// Refresh the context
refresh(context);
if (this.registerShutdownHook) {
try {
context.registerShutdownHook();
}
catch (AccessControlException ex) {
// Not allowed in some environments.
}
}
return context;
}
分享到:
相关推荐
Spring Boot 是在 Spring 的基础上创建一款开源框架,它提供了 spring-boot-starter-web(Web 场景启动器) 来为 Web 开发予以支持。spring-boot-starter-web 为我们提供了嵌入的 Servlet 容器以及 SpringMVC 的依赖...
本教程聚焦于Spring Boot 2.4版本,针对初学者提供一个完整的RESTful CRUD(创建、读取、更新、删除)操作实例,结合尚硅谷B站教程进行讲解。对于已经熟悉Spring Boot 1.5的老手来说,这个教程可能会揭示2.4版本的...
《Spring Boot Starter Mybatis在Spring Boot 3.0.1中的集成详解》 Spring Boot以其简洁的配置和快速的应用开发能力,在Java世界中备受青睐。而Mybatis作为一款轻量级的持久层框架,以其灵活的SQL操作和强大的映射...
《Spring Boot结合MyBatis构建微服务Demo详解》 在当今的互联网开发中,Spring Boot以其简洁、快速的特性成为了主流的Java应用框架。而MyBatis作为一款轻量级的持久层框架,以其灵活易用的特点深受开发者喜爱。本篇...
Spring Boot 是一个开源的 ...对于初学者而言,通过 Spring Boot 官方文档的指导可以快速上手 Spring Boot 开发。而对于有经验的开发者来说,Spring Boot 的灵活性和可扩展性为构建复杂的业务应用提供了强大的支持。
《Spring Boot 1.5.3.RELEASE:构建现代Java应用程序的基石》 Spring Boot是Spring框架的一个扩展,旨在简化创建独立的、生产级别的基于Spring的应用程序。它通过提供默认配置来消除大量的样板代码,使得开发者可以...
《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot框架因其便捷的配置、快速的启动和强大的依赖管理而备受青睐。MyBatis作为一款轻量级的持久层框架,以其灵活的SQL映射和优秀的性能深受开发者喜爱。当...
对于初学者来说,它能够帮助快速上手并构建自己的第一个 Spring Boot 应用;对于有经验的开发者而言,则可以深入了解 Spring Boot 的各种高级特性和最佳实践。无论是作为开发者还是架构师,这份指南都是不可或缺的...
《Spring Boot集成MyBatis详解:基于1.3.5版本》 在现代Java开发中,Spring Boot以其简洁、高效的特点成为了广泛采用的框架。它极大地简化了项目的配置和启动流程,而MyBatis作为轻量级的持久层框架,以其灵活的SQL...
对于初学者或需要不同版本的开发者,可以从提供的链接免费下载`spring-boot-starter-mybatis-spring-boot-2.0.0.zip`,以获取不同版本的集成包。 7. **最佳实践** - 使用MyBatis的注解配合Spring Data JPA,实现...
在项目"spring-boot-excel"中,由于提到"有注释",这意味着源代码应该是清晰易懂的,这对于初学者或者团队协作来说是非常友好的。开发者可以通过阅读这些注释来理解如何设置和使用EasyExcel的各种特性,例如自定义...
在“spring-boot-helloworld”项目中,我们看到这是一个入门级的Spring Boot应用,虽然规模不大,但包含了Spring Boot的核心特性,为初学者提供了很好的学习模板。下面我们将深入探讨其中的关键知识点。 1. **...
【标题】"spring-boot-demo" 是一个基于Spring Boot框架的示例项目,旨在演示如何将Spring Boot与Mybatis集成以实现高效、...对于初学者而言,这是一个很好的实践平台,有助于快速掌握Spring Boot和Mybatis的联合使用。
Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化初始...这个项目对于初学者来说是一个很好的实践平台,通过它你可以学习到如何在 Spring Boot 中集成 MyBatis,实现数据库操作,并了解 MVC 架构的基本原理。
总之,《Spring Boot参考指南》中文版是学习和实践Spring Boot不可或缺的资源,它全面地讲解了框架的各种功能和用法,无论是初学者还是经验丰富的开发者都能从中受益。通过阅读和实践,开发者能够更高效地构建健壮、...
对于初学者来说,这份文档是一份宝贵的资料,有助于快速入门并掌握Spring Boot的开发实践;对于经验丰富的开发者,它也提供了高级配置和最佳实践的参考。Spring Boot Reference Guide是学习和应用Spring Boot不可或...
SpringBootPlus是一个强大的工具,旨在简化基于Spring Boot的项目搭建过程。通过使用SpringBootPlus,开发者可以快速构建高效、可扩展的应用程序,节省时间和精力。本文将深入探讨Spring Boot Plus的核心特性和使用...
Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。Spring Boot 基于 Spring 平台构建,它默认配置了许多常见的设置,如服务器、日志和 JDBC 配置,允许开发者快速地...
Spring Boot 使用的各种示例,以最简单、最实用为标准,此开源项目中的每个示例都以最小依赖,最简单为标准,帮助初学者快速掌握 Spring Boot 各组件的使用。 本项目中所有示例均已经更新到 Spring Boot 3.0 ...