SpringBoot专题(一):入门

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u013644146/article/details/100539367

一、简介

SpringBoot的设计初衷是为了简化Spring的应用开发,采用约定大于配置的思想,化繁为简,整合了整个Spring技术栈,让开发人员可以轻松创建一个独立的、产品级别的应用,为J2EE开发提供一站式解决方案。

Spring项目全家桶:

https://spring.io/projects

SpringBoot的优点:

  • 快速创建独立运行的Spring项目以及与主流框架集成
  • 使用嵌入式的Servlet容器,应用无需打成war包
  • starters自动依赖与版本控制
  • 大量的自动配置,简化开发,也可以修改默认值
  • 无需配置xml文件,无代码生成,开箱即用
  • 提供准生产环境的运行时应用监控
  • 与云计算的天然集成

SpringBoot的缺点:

  • 入门容易,精通难。
  • 对Spring框架底层的熟悉有助于理解SpringBoot

SpringBoot与微服务

什么是微服务:

微服务是一个架构风格,将一个大型的应用分成多个小型服务,可以同Http的方式进行互通,且每个小型服务都是一个可独立替换和独立升级的单元;

大型应用做成单体应用与做成微服务的区别:

单体应用的测试、部署简单,但是协同开发与迭代的效率不高,微服务的特点则与之相反。

微服务的抽象描述:图中每个原点都是一个微服务,所有的原点一起组成一个大型的应用。

Spring如何通过微服务实现分布式:

SpringBoot 创建一个一个的微服务

SpringCloud 构建微服务的分布式部署

Spring Cloud Data Flow 实现数据流的传输、批处理等

SpringBoot的环境要求:

JDK:1.8

Maven:3.3,Maven的settings.xml中设置JDK的版本

IDEAL:2017

二、HelloWorld

1、SpringBoot官网创建一个SpringBoot工程,系统会生成如下两个SpringBoot的依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.7.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

2、写一个Controller,用Get请求返回"Hello World!"返回

@RestController
public class TestController {
    
	@GetMapping(value="/hello")
    public String test(){
        return "Hello World!";
    }
}

3、启动Application类,浏览器测试hello请求

如何让SpringBoot将项目打成jar包?pom文件中设置packing属性,packing为war的时候,打的就是war包。

<packaging>jar</packaging>

三、内部原理

SpringBoot默认的依赖版本管理:在pom.xml 文件中

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.7.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

这个依赖的父项目是:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.1.7.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

这是管理SpringBoot所有默认的依赖版本的地方;

以后导入依赖不需要写版本号(没有被dependencies管理的依赖自然要声明版本号)

启动器:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-starter-web:SpringBoot的场景启动器,提供Web正常运行所需要的组件依赖。

SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter,相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器。

官网的starters(启动器)场景列表:

https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/htmlsingle/#using-boot-starter

主程序类,入口类

/**
 * SpringBoot 来标注一个主程序类,表明这是一个SpringBoot应用
 */
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
	
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
		
		return builder.sources(new Class[] { Application.class });
	  
	}	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

@SpringBootApplication: SpringBoot的主配置类

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

标注在某个类上,表示这是一个SpringBoot的主配置类和入口类

@Configuration:配置类上来标注这个注解;

配置类等同于Spring旧版本中的配置文件;配置类也是容器中的一个组件@Component

@EnableAutoConfiguration:开启自动配置功能

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

使SpringBoot的自动配置生效

@AutoConfigurationPackage:自动配置包

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {

@Import(AutoConfigurationPackages.Registrar.class)

Spring的底层注解@Import,给容器中导入一个组件,由导入的组件有 AutoConfigurationPackages.Registrar.class

将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面的所有组件扫描到Spring容器;

因此,SpringBoot的主配置类的位置不能随意指定。

@Import(AutoConfigurationImportSelector.class)

@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

给容器中导入组件

AutoConfigurationImportSelector:导入哪些组件的选择器;

将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;

会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件。

有了自动配置类,免去了我们手动编写配置注入功能组件的工作;

从类路径下的 META-INF/spring.factories 获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器中,自动配置类就会生效,帮我们进行自动配置工作。(以前需要手动配置的东西,自动配置都会自动配置好)

J2EE的整体整合解决方案和自动配置都在 spring-boot-autoconfigure-2.1.7.RELEASE.jar;

四、快速创建一个SpringBoot项目

SpringBoot官网提供自动生成一个SpringBoot的方式:

https://start.spring.io/

IDE工具则可以使用Spring的项目创建向导快递创建一个Spring Boot项目;

快速生成的SpringBoot项目包含以下内容:

主配置类 Application.java

resource文件夹中目录结构:

  • static:保存所有的静态资源;js css images;
  • templates:保存所有的模板页面;(SpringBoot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf);
  • application.properties:SpringBoot应用的配置文件,可以在该文件中修改配置的默认值,如端口号

 

 

 

猜你喜欢

转载自blog.csdn.net/u013644146/article/details/100539367