`
ahua186186
  • 浏览: 562049 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

初学spring boot(扫盲)---001

 
阅读更多
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-starter-web.jar

    Spring Boot 是在 Spring 的基础上创建一款开源框架,它提供了 spring-boot-starter-web(Web 场景启动器) 来为 Web 开发予以支持。spring-boot-starter-web 为我们提供了嵌入的 Servlet 容器以及 SpringMVC 的依赖...

    spring-boot-04-web-restfulcrud

    本教程聚焦于Spring Boot 2.4版本,针对初学者提供一个完整的RESTful CRUD(创建、读取、更新、删除)操作实例,结合尚硅谷B站教程进行讲解。对于已经熟悉Spring Boot 1.5的老手来说,这个教程可能会揭示2.4版本的...

    spring-boot-starter-mybatis-spring-boot-3.0.1.tar.gz

    《Spring Boot Starter Mybatis在Spring Boot 3.0.1中的集成详解》 Spring Boot以其简洁的配置和快速的应用开发能力,在Java世界中备受青睐。而Mybatis作为一款轻量级的持久层框架,以其灵活的SQL操作和强大的映射...

    spring-boot-examples-master.zip

    《Spring Boot结合MyBatis构建微服务Demo详解》 在当今的互联网开发中,Spring Boot以其简洁、快速的特性成为了主流的Java应用框架。而MyBatis作为一款轻量级的持久层框架,以其灵活易用的特点深受开发者喜爱。本篇...

    spring-boot-reference-guide-zh.pdf

    Spring Boot 是一个开源的 ...对于初学者而言,通过 Spring Boot 官方文档的指导可以快速上手 Spring Boot 开发。而对于有经验的开发者来说,Spring Boot 的灵活性和可扩展性为构建复杂的业务应用提供了强大的支持。

    spring-boot-1.5.3.RELEASE

    《Spring Boot 1.5.3.RELEASE:构建现代Java应用程序的基石》 Spring Boot是Spring框架的一个扩展,旨在简化创建独立的、生产级别的基于Spring的应用程序。它通过提供默认配置来消除大量的样板代码,使得开发者可以...

    spring-boot-starter-mybatis-spring-boot-1.0.2.tar.gz

    《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot框架因其便捷的配置、快速的启动和强大的依赖管理而备受青睐。MyBatis作为一款轻量级的持久层框架,以其灵活的SQL映射和优秀的性能深受开发者喜爱。当...

    spring-boot-reference.pdf

    对于初学者来说,它能够帮助快速上手并构建自己的第一个 Spring Boot 应用;对于有经验的开发者而言,则可以深入了解 Spring Boot 的各种高级特性和最佳实践。无论是作为开发者还是架构师,这份指南都是不可或缺的...

    spring-boot-starter-mybatis-spring-boot-1.3.5.zip

    《Spring Boot集成MyBatis详解:基于1.3.5版本》 在现代Java开发中,Spring Boot以其简洁、高效的特点成为了广泛采用的框架。它极大地简化了项目的配置和启动流程,而MyBatis作为轻量级的持久层框架,以其灵活的SQL...

    spring-boot-starter-mybatis-spring-boot-2.0.0.zip

    对于初学者或需要不同版本的开发者,可以从提供的链接免费下载`spring-boot-starter-mybatis-spring-boot-2.0.0.zip`,以获取不同版本的集成包。 7. **最佳实践** - 使用MyBatis的注解配合Spring Data JPA,实现...

    spring-boot-excel springboot整合easyexcel 有注释 打开可以运行

    在项目"spring-boot-excel"中,由于提到"有注释",这意味着源代码应该是清晰易懂的,这对于初学者或者团队协作来说是非常友好的。开发者可以通过阅读这些注释来理解如何设置和使用EasyExcel的各种特性,例如自定义...

    spring-boot-helloworld

    在“spring-boot-helloworld”项目中,我们看到这是一个入门级的Spring Boot应用,虽然规模不大,但包含了Spring Boot的核心特性,为初学者提供了很好的学习模板。下面我们将深入探讨其中的关键知识点。 1. **...

    spring-boot-demo

    【标题】"spring-boot-demo" 是一个基于Spring Boot框架的示例项目,旨在演示如何将Spring Boot与Mybatis集成以实现高效、...对于初学者而言,这是一个很好的实践平台,有助于快速掌握Spring Boot和Mybatis的联合使用。

    spring boot-mybatis demo

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化初始...这个项目对于初学者来说是一个很好的实践平台,通过它你可以学习到如何在 Spring Boot 中集成 MyBatis,实现数据库操作,并了解 MVC 架构的基本原理。

    spring-boot-reference-guide-zh-中文, spring-boot参考指南

    总之,《Spring Boot参考指南》中文版是学习和实践Spring Boot不可或缺的资源,它全面地讲解了框架的各种功能和用法,无论是初学者还是经验丰富的开发者都能从中受益。通过阅读和实践,开发者能够更高效地构建健壮、...

    spring-boot-reference

    对于初学者来说,这份文档是一份宝贵的资料,有助于快速入门并掌握Spring Boot的开发实践;对于经验丰富的开发者,它也提供了高级配置和最佳实践的参考。Spring Boot Reference Guide是学习和应用Spring Boot不可或...

    快速搭建SpringBoot工具spring-boot-plus-master.zip

    SpringBootPlus是一个强大的工具,旨在简化基于Spring Boot的项目搭建过程。通过使用SpringBootPlus,开发者可以快速构建高效、可扩展的应用程序,节省时间和精力。本文将深入探讨Spring Boot Plus的核心特性和使用...

    spring-boot-work-master.zip_spring boot_springboot_springboot 后台

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。Spring Boot 基于 Spring 平台构建,它默认配置了许多常见的设置,如服务器、日志和 JDBC 配置,允许开发者快速地...

    about learning Spring Boot. Spring Boot 教程、技术栈示例代码,快速简单上手教程.zip

    Spring Boot 使用的各种示例,以最简单、最实用为标准,此开源项目中的每个示例都以最小依赖,最简单为标准,帮助初学者快速掌握 Spring Boot 各组件的使用。 本项目中所有示例均已经更新到 Spring Boot 3.0 ...

Global site tag (gtag.js) - Google Analytics