SpringBoot初试

SpringBoot简介

简化Spring应用开发的一个框架

整个Spring技术栈的一个大整合

J2EE开发的一站式解决方案

微服务

2014, Martin fowler

微服务:一种架构风格

一个应用应该是一组小型服务,可以通过HTTP的方式进行互通. 

每一个功能元素最终都是一个可独立替换和独立升级的软件单元

 

与之对应的单体应用:ALL IN ONE

环境准备

Maven设置

Mavenpom.xml配置使用JDK1.8

IDEA设置

Mavensettings.xml文件以及仓库路径都设置成自己电脑上的

Spring Boot之Hello World

功能实现:浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串

1. 创建一个Maven工程(jar)

点击 Create New Project 

在弹出的窗口中选中Maven并检查自己的JDK是否正确,然后点击Next

填写坐标

填写工程名跟工程存放的地址

启动IDEA的自动导入等待Maven将需要的插件下载到仓库即可

2. 导入SprngBoot相关依赖

官网示例

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
</parent>

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

3. 编写一个主程序:用来启动SpringBoot应用

main/java中创建一个HelloWorld

在类上添加注解告诉SpringBoot这是一个主程序

main函数中通过SpringApplication.run()启动Spring应用,参数分别是该类跟main函数的args

@SpringBootApplication
public class HelloWorld {
    public static void main(String[] args) {         
        // 启动Spring应用                                  
        SpringApplication.run(HelloWorld.class, args);
    }
}

编写相关的Controllerservice

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        return "Hello world";
    }
}

然后运行main方法即可

最后在浏览器通过127.0.0.1:8080/hello访问即可

简化部署

使用SpringBoot不需要再讲项目打成war包,而是在pom.xml文件中加入如下代码

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

然后在IDEA中执行打包

可以看到,打完的jar包被放在了target目录下

将其复制出来放到任意目录

然后在dos窗口中进入该目录,使用java -jar xxx.jar的命令运行该jar包即可。并不需要目标服务器安装Tomcat,因为已经内嵌了Tomcat

回车执行后会出现如下结果

最后在浏览器访问即可

Hello World探究

上面虽然成功的把Hello World跑起来了,但是其中仍然有许多疑惑等待解决

pom.xml

下面对pom.xml中的内容进行探究

父项目

在pom.xml文件中有这样一个父元素标签,如下所示

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
</parent>

点进这个 spring-boot-starter-parent 可以看到它也有一个父项目,如下所示

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

点进spring-boot-dependencies可以看到里面有一个properties标签,里面管理了所有SpringBoot应用的所有的依赖的版本,因此我们以后导入依赖默认是不需要再书写版本(但是没有在dependencies里面管理的依赖自然是需要声明版本的)

启动器

在pom.xml中导入了这样的依赖

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

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

关于启动器

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

下面是spring官网展示的启动器(部分)

主程序类,主入口类

@SpringBootApplication
public class HelloWorld {
    public static void main(String[] args) {
        // 启动SpringBoot应用
        SpringApplication.run(HelloWorld.class, args);
    }
}

由上可知,必须在类上加上@SpringBootApplication注解才能将这个类作为主程序类,而对该注解的说明是这样的:SpringBoot应用,把这个注解标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动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 {

这里面由许多注解组成,下面对这些注解做探究

@SpringBootConfiguration

SpringBoot的配置类,该注解标注在某个类上表示这是一个SpringBoot的配置类。点进这个注解可以看到一个@Configuration注解,就是Spring的配置注解

@EnableAutoConfiguration

开启自动配置功能,以前我们需要配置的东西,SpringBoot会帮我们自动配置

 

点进这个注解,也是由许多注解组成

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

自动配置包,将主配置类(@SpringBootApplication标注的类)的所有包以及所有子包里面的所有组件扫描到Spring容器中

@Import(AutoConfigurationImportSelector.class)

Spring的底层注解@import,给容器中导入一个组件:AutoConfigurationImportSelector,将所有需要导入的组件以全类名的方式返回,这些组件会被添加到容器中,会给容器导入非常多的自动配置类(xxxAutoConfiguration),这些自动配置类的作用就是给容器中导入这个场景需要的所有组件,并配置好这些组件。自动类如下所示(部分)

 

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

那么问题来了,这些自动配置类是如何被导入的呢?

其实是通过 SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, classLoader)SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中后,自动配置生效,帮我们进行自动配置工作

使用Spring Initializer快速创建SpringBoot项目

导入模块,也就是上面说的启动器。需要什么模块就导入什么模块

这些多余生成的东西可以删除掉

查看pom.xml在导入的依赖中相比之前会多导入一个SpringBoot进行单元测试的模块

<!-- SpringBoot进行单元测试的模块 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

在默认生成的SpringBoot项目中

  • 主程序已经生成好了,我们只需要写我们自己的逻辑
  • resources文件夹中的目录结构
    • static:保存所有的静态资源,如js、css、images
    • Templates:保存所有的模板页面,由于SpringBoot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面,但是可以使用模板引擎(freemarker,thymeleaf)
    • Application.properties:SpringBoot应用的默认配置。SpringBoot一切都是配置好了的,但是如果有时候想要更改配置就可以在这个配置文件中修改,例如修改端口号:server.port=8081
posted @ 2018-09-05 00:04  Jin同学  阅读(121)  评论(0编辑  收藏  举报