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.0.3.RELEASE是该工具的一个稳定版本,适合初学者使用。 在深入探讨Spring Boot CLI之前,我们先了解一下Spring Boot。Spring Boot简化了Spring应用程序的初始设置和配置,它内置了服务器、数据源、...
本教程聚焦于Spring Boot 2.4版本,针对初学者提供一个完整的RESTful CRUD(创建、读取、更新、删除)操作实例,结合尚硅谷B站教程进行讲解。对于已经熟悉Spring Boot 1.5的老手来说,这个教程可能会揭示2.4版本的...
Spring Boot 是一个开源的 ...对于初学者而言,通过 Spring Boot 官方文档的指导可以快速上手 Spring Boot 开发。而对于有经验的开发者来说,Spring Boot 的灵活性和可扩展性为构建复杂的业务应用提供了强大的支持。
《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot和MyBatis是两个极为重要的框架。Spring Boot以其简化配置、快速启动的优势,深受开发者喜爱,而MyBatis作为轻量级的持久层框架,以其灵活的SQL操作和...
《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应用开发框架 v2.7.17.zip"是学习和开发Spring Boot应用程序的重要资料,无论是初学者还是经验丰富的开发者,都能从中受益。通过探索源码和文档,我们可以深入理解Spring Boot的内部工作机制...
【标题】"spring-boot-demo" 是一个基于Spring Boot框架的示例项目,旨在演示如何将Spring Boot与Mybatis集成以实现高效、...对于初学者而言,这是一个很好的实践平台,有助于快速掌握Spring Boot和Mybatis的联合使用。
总的来说,《学习Spring Boot 2.0 第2版》是一本全面而实用的指南,无论是初学者还是有经验的开发者,都能从中受益匪浅。通过阅读这本书,你可以深入理解Spring Boot 2.0的精髓,提高开发效率,实现更高质量的Java...
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 配置,允许开发者快速地...