SpringBoot初试
SpringBoot简介
简化Spring应用开发的一个框架
整个Spring技术栈的一个大整合
J2EE开发的一站式解决方案
微服务
2014, Martin fowler
微服务:一种架构风格
一个应用应该是一组小型服务,可以通过HTTP的方式进行互通.
每一个功能元素最终都是一个可独立替换和独立升级的软件单元
与之对应的单体应用:ALL IN ONE
环境准备
Maven设置
Maven的pom.xml配置使用JDK1.8
IDEA设置
将Maven跟settings.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>
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); } }
编写相关的Controller跟service
@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
- static:保存所有的静态资源,如js、css、images