Spring Boot 的简单概述

        扑街前言:本篇文章算是一个引入吧,简单的概述一下spring boot本身是个什么东西,具体的优缺点是什么。

        目前很多人说到spring boot一定会联想到spring cloud,这两者结合是当下很多公司正在使用的分布式框架体系,但是本人在使用spring boot的过程中感觉就算不搭建分布式框架体系,spring boot一样适用于很多需要快速开发项目的公司,甚至过于“臃肿”的老项目也可以更换spring boot,这样能更方便于维护管理。

        如果是在2017年左右,会spring boot是一项比较牛的技能,但是现在这个年代还不会spring boot,那就是时代的眼泪。(其实我目前所在公司的项目组也没有使用到spring boot,但是这并不是我们不学习它的借口,如果没有对应项目经验,那就去看源码,更加理解这个框架本身的原理,就是最好的项目经验。认识到自己是菜鸟的第二十天)


Spring 的缺点和Spring boot的功能:

     先说Spring公认的缺点:

  1. 配置繁琐:大量的xml文件,繁琐的注入方式;
  2. 依赖繁琐:这里是指jar包依赖,spring就算集成了maven管理,也容易出现jar包冲突的问题。

     String boot的功能:

  1. 自动配置:不需要配置大量的xml文件,spring boot实现了自动装配;
  2. 起步依赖:每一个版本的spring boot框架,都会有一个约定各个jar包版本的文件;
  3. 辅助功能:如嵌入式服务器,安全扫描、健康检测、外部配置等。

从上述内容可以看出,spring boot本身并不是对spring功能上的增强,而是提供一种快速使用spring的方式。


spring boot的项目特点:

  1. Spring boot在创建项目时,使用jar的打包方式,因为spring boot内嵌了服务器(默认Tomcat),用Java.jar的方式就能运行整个项目,也就是说jar包中已经有了服务器。但是spring boot项目打war包是不会有内嵌服务器的,因为war包是外部服务器运行。这里也可以看出,每一个spring boot的项目其实都是一个可单独运行的项目,也就是微服务的基本理论;
  2. Spring boot的引导类,是项目的入口,运行main方法就可以启动项目;
  3. 使用Spring boot和spring构建的项目,业务代码编写完全一样,也就说spring boot和spring在业务层次没有任何区别,只是spring boot更方便开发及管理。

YML语法:

        yml就是文件扩展名使用了.yml或者.yaml的文件,相比于传统的xml方式更加简洁,下面展示一下一些简单的内容配置。yml文件中同级元素用相同的制表位表示,下级元素只需要换行加一个制表位既可以,对应的值写在“:”号后面即可。xml中需要有具体的开始标签和结束标签,使用标签的形式来表示出同级元素和下级元素的区别。

<!-- yml文件 -->
spring:
  redis:
    host: localhost
    port: 8080

server:
  port: 8081


<!-- 传统的xml文件 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

Environment对象:

        Environment对象是springframework提供的环境对象,使用在项目启动中,项目启动完成之后,后续也可以在这个对象中获取bean的信息及配置文件中的信息。项目启动中直接是用的是Environment对象的子对象ConfigurableEnvironment对象。

        而项目启动的简单流程为:开启监听 =》创建环境 =》将配置的bean信息放入环境 =》创建IOC容器 =》为IOC创建一个工厂用于实例bean的对象 =》准备环境和IOC工厂关联 =》用环境对象中的bean信息实例化到IOC容器中 =》刷新默认的配置信息 =》继续监听到项目启动结束。

     spring boot读取配置文件内容还有以下方法:

  1. @value(地址);
  2. Environment对象;
  3. @ConfigurationProperties(地址)(这个地址还可以用prefix加一个前缀,可以准确的获取yml文件中的配置内容)。

     下面代码为spring boot的项目启动源码:

/**
 * Run the Spring application, creating and refreshing a new
 * {@link ApplicationContext}.
 * @param args the application arguments (usually passed from a Java main method)
 * @return a running {@link ApplicationContext}
 */
public ConfigurableApplicationContext run(String... args) {
	// 计时器对象
	StopWatch stopWatch = new StopWatch();
	// 计时器启动
	stopWatch.start();
	
	ConfigurableApplicationContext context = null;
	Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
	configureHeadlessProperty();
	
	// 获取监听器集合对象
	SpringApplicationRunListeners listeners = getRunListeners(args);
	// 发布容器 starting 事件(通过spring的事件多播器) 
	listeners.starting();
	try {
		// 封装命令行参数 
		ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
		
		/*
		 * 根据扫描到的监听器对象和函数传入参数,进行环境准备。
		 */
		// 创建环境
		ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
		// 把命令行参数设置到环境中、通过监听器发布环境准备事件  
		configureIgnoreBeanInfo(environment);
		
		//打印图标
		Banner printedBanner = printBanner(environment);
		
		// 根据webApplicationType 来创建IOC容器(通过反射创建)
		context = createApplicationContext();
		
		/*
		 * 获取异常报告
		 * 读取spring.factories文件key SpringBootExceptionReporter对应的value
		 */
		exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
				new Class[] { ConfigurableApplicationContext.class }, context);

		/*
	     * context前置处理,准备上下文环境
		 * 1:把环境设置到容器中
		 * 2:循环调用 AppplicationInitnazlier 进行容器初始化工作
		 * 3:发布容器上下文准备完成事件
		 * 4:注册关于springboot特性的相关单例Bean
		 * 5:发布容器上下文加载完毕事件
		 */
		prepareContext(context, environment, listeners, applicationArguments, printedBanner);
		
		/*
		 * context准备完成之后,将调用 AbstractApplication#refresh 方法,去初始化IOC容器
		 * 同时还会启动内嵌 Tomcat
		 */
		refreshContext(context);
		
		// 后置操作,运行 ApplicationRunner 和 CommandLineRunner 
		afterRefresh(context, applicationArguments);
		
		// 计时停止
		stopWatch.stop();
		
		if (this.logStartupInfo) {
			new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
		}
		
		// 发布容器启动事件
		listeners.started(context);
		callRunners(context, applicationArguments);
	}
	catch (Throwable ex) {
		// 出现异常;调用异常分析保护类进行分析 
		handleRunFailure(context, ex, exceptionReporters, listeners);
		throw new IllegalStateException(ex);
	}

	try {
		// 发布容器运行事件
		listeners.running(context);
	}
	catch (Throwable ex) {
		handleRunFailure(context, ex, exceptionReporters, null);
		throw new IllegalStateException(ex);
	}
	return context;
}

profile:

        当spring boot项目中存在不同环境的yml配置文件时,可以用profile来激活不同的配置文件。(主要场景:测试环境、生产环境的切换)。

不同情况下使用profile:

  • properties配置:spring.profiles.action = 文件尾缀;
  • YML配置:
  • 虚拟机参数:在vmoptions指定,-Dspring.profiles.action = 名称;
  • 命令行参数:Java-jar包名称.jar -spring.profiles.action = 名称。

Spring Boot配置文件加载顺序:

        spring boot程序启动时,会优先加载外部的配置文件,然后加载当前项目下的config目录下的配置文件,最后加载当前项目的根目录下的配置文件。高优先级的配置的属性会生效,不会受到低优先级配置文件的属性影响。


Spring Boot项目引入其他框架:

        spring boot项目引入其他框架,只需要用maven将其jar导入,然后用配置文件的方式配置好对应的参数即可。不需要为它们注入对应的配置对象,只需要声明具体对象,然后注解注入即可使用,至于为什么可以这样做,下面文章说具体的自动配置原理。


        上述就是本人对于spring boot的一些个人见解,非常简单,这篇文章就不再去构建一个spring boot的项目了,业务逻辑层和spring完全一致的情况下,spring的开发经验就能做到spring boot的写法。后续我还会整理出一个系列的Spring Boot分析,然后再对接一下spring cloud的管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值