快捷搜索: 长连接 前端 源码 pan

写给新手的SpringBoot完整教程——01入门篇

一.SpringBoot简介

SpringBoot是一个集成了Spring技术栈的一个大整合,是一个简化了Spring应用开发的框架,可以一站式解决J2EE的开发流程。

优点:

1.可以快速独立的创建Spring及主流框架集成的项目。 2.使用了嵌入式的Servlet容器,无需生成WAR包 3.我们在使用SpringBoot进行开发时可以使用Starts启动依赖,而SpringBoot会自动地把所需要的其他相关技术jar包导入. 4.大量的自动配置,极大地简化了我们的开发。 5.无需XML文件的大量编写,也不会生成代码,底层是利用SpringBoot写好的API来调用实现,开箱即用 6.SpringBoot也有运维监控项目的功能 7.SpringBoot与云计算的集成

虽然SpirngBoot确实很大程度上简化了我们的开发,但是由于集成度很高,他的底层的实现对我们而言透明度很大,因此如果不对Spring框架了解的比较深入,就很难精通SpringBoot。

二.微服务

微服务起源于2014年由MartinFlower写的一篇文章,这里我们简单介绍一下微服务,现在我们回想一下我们之前没学习微服务之前,我们做的那些项目,其实都是一些单体应用。

所谓单体应用就是指把所有的应用需要的资源放到一个项目里面,即所有的功能都集中在单进程里面,那么可能由于我们的服务器运载能力较差我们就会用多个服务器来跑这一个项目,那么这是就需要把整个项目复制到另外的服务器上。这就是单体应用。
微服务:我们将各个功能模块分割出来为单独的功能元素,那么每个功能放在独立的服务上,那么每一个功能由于独立出来我们在后面进行跨服务器分发这些服务的时候就可以有选择性组合(各功能的组合是通过http来实现的互联),而不需要像单体应用那样复制所有的功能。

三.环境约束

本系列教程使用到的工具及版本如下:

IntelliJ IDEA 2019.1 x64; Apache Maven 3.5.2; jdk:版本为1.8; SpringBoot:1.5.9

接下来我们需要配置一下Maven:IDEA选择本地Maven配置,否则他会默认选择IDEA内嵌的Maven.下面的配置文件都要勾上Override表示使用我们自己的Maven的配置文件。 然后在Maven的Settings.xml文件里面配置:(指明我们使用的是jdk1.8)

<profile>
  <id>jdk-1.8</id>
  <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
  </activation>
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  </properties>
</profile>

四.第一个SpringBoot项目——HelloWorld

我们需要实现一个功能:浏览器发送一个hello请求,然后我们返回给浏览器I am Jack.

1.创建Maven工程

2.导入SpringBoot的相关依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

3.编写主程序类,并启动应用

package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * 1.创建HelloWorldMainApplication类,并声明这是一个主程序类也是个SpringBoot应用
 */
@SpringBootApplication
public class HelloWorldMainApplication {
          
   
    /**
     * 2.编写main方法
     */
    public static void main(String[] args) {
          
   
        //3.开始启动主程序类
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}

4.创建Controller

package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
          
   
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
          
   
        return "I am Jack";
    }
}

5.运行测试

接下来允许main方法,访问:http://localhost:8080/hello;却发现 我们这里问题在于目录结构除了问题,改为如下:

6.简化部署

导入插件

<!-- 这个插件,可以将应用打包成一个可执行的jar包;-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

再次访问:

五.HelloWorld探究

1.pom文件

I.父项目

<!--应用的父项目-->
	<parent>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-parent</artifactId>
	    <version>1.5.9.RELEASE</version>
	</parent>
<!--我们继续追查spring-boot-starter-parent
最后发现最上层的父项目是-->
	<parent>
	  <groupId>org.springframework.boot</groupId>
	  <artifactId>spring-boot-dependencies</artifactId>
	  <version>1.5.9.RELEASE</version>
	  <relativePath>../../spring-boot-dependencies</relativePath>
	</parent>
<!---这才是真正的项目管理者,他指定了所有需要的jar包版本依赖->

II.导入的依赖

这里的依赖没有指明版本,这是由于在spring-boot-dependencies中都已经指明了版本。具体原理参见

spring-boot-starter-web: spring-boot-starter是spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件.

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

2.主程序类

@SpringBootApplication

@SpringBootApplication用来标注应用的主配置类,那么SpringBoot就可以通过启动这个主配置类的main方法来启动SpringBoot应用。 而实际上@SpringBootApplication是一个组合注解,如下:

I.@SpringBootConfiguration

我们注意到@SpringBootConfiguration他其实也被下面注解所修饰:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration

而这里的@Configuration就是我们Spring的一个配置注解,它可以对应于我们的Spring的配置文件。而配置类@Configuration其实也被@Component修饰,也就是说他也是一个组件。

II.@EnableAutoConfiguration

接下来我们再来看修饰@SpringBootApplication的另外一个注解@EnableAutoConfiguration,我们注意到我们SpringBoot的SpringMVC等居然也是可以使用起来的,这说明这个注解帮助我们把我们以前需要的配置都帮我们自动配置了起来。那么它又是如何实现的呢,我们看@EnableAutoConfiguration由下面注解组合:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)

①我们来看@AutoConfigurationPackage如下: 我们发现在最后计算的结果是com.jack,也就是我们的主配置类HelloWorldMainApplication.java所在的包,于是@EnableAutoConfiguration的作用就在于将主配置类所在包下面的所有类的注解都可以扫描,于是我们的@Controller等注解为什么可以实现的原因。 ②@Import(EnableAutoConfigurationImportSelector.class)这个注解 @Import作用在于给容器导入组件。这里就是导入EnableAutoConfigurationImportSelector(自动配置导包选择器) 其父类:AutoConfigurationImportSelector.class有下面方法: 我们注意到这个方法的返回值是字符串数组,这个字符串数组返回的是需要导入的其它所有组件的全类名,这些组件就会被放到容器中,而实际上这些组件都是自动配置类(xxxAutoConfiguration),这些组件都是SpringBoot应用启动使用所需要时帮我们自动配置。如下: configurations是通过下面这个方法来的:

/*该方法实际上是读取spring-boot-autoconfigure-1.5.9.RELEASE.jar
/META-INF/maven/spring.factories里面读取指定的配置类,见下图
*/
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());

六.使用Spring Initializer快速创建Spring Boot项目

该方法是向导创建,需要联网才可以使用。 创建好后得到的目录结构如下(红框内容可以删除):

接下来我们需要说明一下resources目录结构:

static:放置静态资源如js,css,image等内容
templates:放置模板引擎(SpringBoot默认不支持Jsp),如freemarker,
		  thymeleaf(官方推荐)
application.properties:Spring Boot应用的配置文件;可以修改一些默认设置,
如写server.port=8081(指定端口号为8081,SpringBoot默认是8080)
经验分享 程序员 微信小程序 职场和发展