SpringBoot

一、SpringBoot是什么?

 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
 SpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决


二、SpringBoot的特点

SpringBoot所具备的特征有:
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
重要策略

SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置。开箱即用,Outofbox,是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。约定优于配置,Convention over configuration,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。
SpringBoot应用系统开发模板的基本架构设计从前端到后台进行说明:前端常使用模板引擎,主要有FreeMarker和Thymeleaf,它们都是用Java语言编写的,渲染模板并输出相应文本,使得界面的设计与应用的逻辑分离,同时前端开发还会使用到Bootstrap、AngularJS、JQuery等;在浏览器的数据传输格式上采用Json,非xml,同时提供RESTfulAPI;SpringMVC框架用于数据到达服务器后处理请求;到数据访问层主要有Hibernate、MyBatis、JPA等持久层框架;数据库常用MySQL;开发工具推荐IntelliJIDEA。
 

三、为什么要使用SpringBoot

1.简化开发:Spring Boot提供了自动配置和默认设置,使得开发人员能够快速搭建和部署应用程序。它内置了许多常见的库和框架,如Spring MVC、Spring Data等,大大简化了开发过程,提高了开发效率。

2.模块化设计:Spring Boot采用了模块化的设计,使得开发人员可以根据需要选择所需的功能模块,而无需引入整个Spring框架。这种灵活性使得开发人员能够更加精确地控制应用程序的依赖关系,并减少不必要的资源消耗。

3.内嵌式容器:Spring Boot内置了多种常见的Servlet容器,如Tomcat、Jetty等,开发人员可以直接将应用程序打包成可执行的JAR文件,并在没有外部容器的情况下运行。这样做不仅简化了应用程序的部署和运维,还提高了应用程序的可移植性和扩展性。

4.配置管理:Spring Boot通过外部化配置的方式,使得应用程序的配置更加灵活和易于管理。开发人员可以使用各种配置文件(如properties、yaml等)来配置应用程序的行为,同时还支持使用环境变量、命令行参数等方式进行配置。

总之,使用Spring Boot能够极大地简化和加速应用程序的开发过程,并提供了丰富的功能和灵活的配置管理,使得开发人员能够更加专注于业务逻辑的实现。

四、如何使用SpringBoot

  1. 创建一个新的Spring Boot项目:可以使用Spring Initializr 来创建一个新的Spring
    Boot项目。在该网站上选择所需的项目依赖和配置,然后点击生成项目按钮,即可下载一个基本的Spring Boot项目的压缩包。

  2. 导入项目到IDE中:将下载的项目压缩包解压,并导入到你喜欢的集成开发环境(IDE)中,如Eclipse、IntelliJ IDEA等。

  3. 开发应用程序:在IDE中打开项目文件夹,开始编写你的应用程序。可以创建控制器类、服务类、数据访问对象等,根据需要添加所需的功能模块和业务逻辑。

  4. 配置应用程序:在项目中,可以通过application.propertiesapplication.yml等配置文件来设置应用程序的行为,例如数据库连接、服务器端口等。你还可以使用注解方式或Java配置方式来进行细粒度的配置。

  5. 运行应用程序:使用IDE提供的运行功能,启动你的Spring Boot应用程序。Spring Boot会自动检测并配置应用程序所需的所有依赖和环境,使得应用程序能够顺利运行。

  6. 测试应用程序:使用各种测试工具(如JUnit、Mockito等)编写单元测试和集成测试,确保应用程序的各个组件和功能正常工作。

  7. 打包部署应用程序:使用Maven或Gradle等构建工具,将应用程序打包成可执行的JAR文件或WAR文件。然后,将打包好的文件部署到目标环境中,可以是本地服务器、云平台或容器等。

五、SpringBoot的三个核心文件

  1. pom.xml(或build.gradle):这是一个项目管理文件,使用Maven或Gradle等构建工具来定义和管理项目的依赖关系、插件配置等。在pom.xml文件中可以指定要使用的Spring Boot版本以及其他必要的依赖项。

  2. Application.java:这是Spring Boot应用程序的入口类,它包含main方法。通过运行该类中的main方法,可以启动Spring Boot应用程序。在该类中,你可以进行一些初始化配置,如配置数据源、声明bean等。

  3. application.properties(或application.yml):这是应用程序的配置文件,用于配置应用程序的各种属性和行为。可以在该文件中设置数据库连接信息、服务器端口号、日志级别等。使用.properties后缀的文件格式,或者使用.yml或.yaml后缀的文件格式都是支持的。

这三个核心文件是Spring Boot应用程序开发中最常见和重要的文件。pom.xml(或build.gradle)用于管理项目依赖,Application.java作为应用程序的入口点,而application.properties(或application.yml)用于配置应用程序的行为。根据具体的项目需求,还可以有其他的配置文件和类文件,但这些核心文件是基本的组成部分。

六、SpringBoot的原理

  1. 自动配置(Auto-configuration):Spring Boot通过自动配置机制来简化应用程序的配置。它根据类路径上的依赖以及开发人员提供的配置信息,自动推断并配置所需的Spring组件、库和框架。这样,开发人员可以专注于业务逻辑的实现,而无需手动配置大量的细节。

  2. 起步依赖(Starter Dependencies):Spring Boot引入了起步依赖的概念,它是一种预定义的依赖集合,包含了在特定场景下常用的库和框架。通过引入适当的起步依赖,开发人员可以快速构建具备特定功能的应用程序,而无需手动添加和配置各种依赖项。

  3. 内嵌式容器(Embedded Container):Spring Boot内置了多种常见的Servlet容器,如Tomcat、Jetty等。开发人员可以将应用程序打包成可执行的JAR文件,并在没有外部容器的情况下运行。内嵌式容器提供了方便的开发和部署体验,同时也提高了应用程序的可移植性和扩展性。

  4. 简化的配置管理:Spring Boot使用约定大于配置的原则,提供了简化的配置管理。开发人员可以使用properties文件、yaml文件等进行应用程序的配置,还支持使用环境变量、命令行参数等方式进行配置。这种灵活性使得配置管理变得更加简单和易于维护。

  5. 自动装配(Auto-wiring):Spring Boot利用Spring框架的自动装配机制来实现依赖注入和组件扫描。通过在类上添加注解,Spring Boot能够自动识别并创建所需的Bean,并将其注入到其他组件中。这样,开发人员无需显式配置bean的创建和依赖关系,大大简化了配置和开发过程。

总之,Spring Boot通过自动配置、起步依赖、内嵌式容器、简化的配置管理和自动装配等机制,使得开发人员能够快速构建、配置和部署应用程序。它的设计原理旨在简化开发过程、提高开发效率,并提供良好的可移植性和扩展性。

七、SpringBoot的启动方式

如果我们是通过main方法启动的springboot程序,我们就必须要调用SpringApplication.run(),既然要调用SpringApplication.run()就必须初始化SpringApplication调用它的构造函数。

接下来我们一起来看看run的逻辑,先看SpringApplication的构造函数:
 

	public SpringApplication(Object... sources) {
		initialize(sources);
	}

构造函数会调用initialize(sources)

@SuppressWarnings({ "unchecked", "rawtypes" })
	private void initialize(Object[] sources) {
		if (sources != null && sources.length > 0) {
			this.sources.addAll(Arrays.asList(sources));
		}
		this.webEnvironment = deduceWebEnvironment();
		setInitializers((Collection) getSpringFactoriesInstances(
				ApplicationContextInitializer.class));
		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
		this.mainApplicationClass = deduceMainApplicationClass();
	}

这是会为SpringApplication做一个初始化,给一些变量赋值,添加一些数据源信息。

在回到run方法

/**
	 * 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;
		FailureAnalyzers analyzers = null;
		configureHeadlessProperty();
		SpringApplicationRunListeners listeners = getRunListeners(args);
		listeners.starting();
		try {
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(
					args);
			ConfigurableEnvironment environment = prepareEnvironment(listeners,
					applicationArguments);
			Banner printedBanner = printBanner(environment);
			context = createApplicationContext();
			analyzers = new FailureAnalyzers(context);
			prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
			refreshContext(context);
			afterRefresh(context, applicationArguments);
			listeners.finished(context, null);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass)
						.logStarted(getApplicationLog(), stopWatch);
			}
			return context;
		}
		catch (Throwable ex) {
			handleRunFailure(context, listeners, analyzers, ex);
			throw new IllegalStateException(ex);
		}
	}

该方法中实现了如下几个关键步骤:

  1. 创建了应用的监听器SpringApplicationRunListeners并开始监听
  2. 加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment,其最终也是继承了ConfigurableEnvironment.
  3. 配置环境(Environment)加入到监听器对象中(SpringApplicationRunListeners)
  4. 创建run方法的返回对象:ConfigurableApplicationContext(应用配置上下文),源码如下:
    /**
    	 * Strategy method used to create the {@link ApplicationContext}. By default this
    	 * method will respect any explicitly set application context or application context
    	 * class before falling back to a suitable default.
    	 * @return the application context (not yet refreshed)
    	 * @see #setApplicationContextClass(Class)
    	 */
    	protected ConfigurableApplicationContext createApplicationContext() {
    		Class<?> contextClass = this.applicationContextClass;
    		if (contextClass == null) {
    			try {
    				contextClass = Class.forName(this.webEnvironment
    						? DEFAULT_WEB_CONTEXT_CLASS : DEFAULT_CONTEXT_CLASS);
    			}
    			catch (ClassNotFoundException ex) {
    				throw new IllegalStateException(
    						"Unable create a default ApplicationContext, "
    								+ "please specify an ApplicationContextClass",
    						ex);
    			}
    		}
    		return (ConfigurableApplicationContext) BeanUtils.instantiate(contextClass);
    	}
    

  5. 再回到run方法内,prepareContext方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联

  6. 接下来的refreshContext(context)方法(初始化方法如下)将是实现spring-boot-starter-*(jpa、redis等)自动化配置的关键,包括spring.factories的加载,bean的实例化等核心工作。

  7. 配置结束后,Springboot做了一些基本的收尾工作,返回了应用环境上下文。回顾整体流程,Springboot的启动,主要创建了配置环境(environment)、事件监听(listeners)、应用上下文(applicationContext),并基于以上条件,在容器中开始实例化我们需要的Bean,至此,通过SpringBoot启动的程序已经构造完成。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值