Spring Boot的背景,我们为什么要用它,它能给我们带来什么遍便利?
回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用gradle来构建的话基本也一样)然后新建Spring相关的xml文件,而且往往那些xml文件还不会少。然后继续使用tomcat或者jetty作为容器来运行这个工程。基本上每次创建一个新的项目都是这么一个流程,而我们有时候仅仅想快速的创建一个Spring web工程来测试一些东西,或者是希望能节省时间。
现在我们使用Spring Boot就可以快速的做到这些了。spring boot可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server。
Spring boot 的理念:
从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。简便起见,该框架也提供了命令行界面,它可以用来运行和测试Boot应用。框架的发布版本,包括集成的CLI(命令行界面),可以在Spring仓库中手动下载和安装。
实际中springboot将应用打包之后,会生成一个fat jar,里面包含了应用依赖的jar包,还有Spring boot loader相关的类
Fat jar的启动Main函数是JarLauncher,它负责创建一个LaunchedURLClassLoader来加载/lib下面的jar,并以一个新线程启动应用的Main函数。LaunchedURLClassLoader和普通的URLClassLoader的不同之处是,它提供了从Archive里加载.class的能力。结合Archive提供的getEntries函数,就可以获取到Archive里的Resource。当然里面的细节还是很多的。(详细查看源码)
Spring boot 实现?
Spring Boot 推荐采用基于 Java 注解的配置方式,而不是传统的 XML。只需要在主配置 Java 类上添加“@EnableAutoConfiguration”注解就可以启用自动配置。Spring Boot 的自动配置功能是没有侵入性的,只是作为一种基本的默认实现。开发人员可以通过定义其他 bean 来替代自动配置所提供的功能。比如当应用中定义了自己的数据源 bean 时,自动配置所提供的 HSQLDB 就不会生效。这给予了开发人员很大的灵活性。既可以快速的创建一个可以立即运行的原型应用,又可以不断的修改和调整以适应应用开发在不同阶段的需要。可能在应用最开始的时候,嵌入式的内存数据库(如 HSQLDB)就足够了,在后期则需要换成 MySQL 等数据库。Spring Boot 使得这样的切换变得很简单。
@EnableAutoConfiguration”注解的作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,这就减少了开发人员的工作量。@EnableAutoConfiguration注解会告知Boot要采用一种特定的方式来对应用进行配置。这种方法会将其他样板式的配置均假设为框架默认的约定,因此能够聚焦于如何尽快地使应用准备就绪以便运行起来。
Spring Boot 的这个配置优先级看似复杂,其实是快速地修改配置参数值,而不需要重新打包和部署应用。
Spring boot的配置和使用:
1. 首先需要新建一个普通的maven 工程;
2. 要在pom.xml文件中添加依赖如下
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spingboot-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.0.0.RC1</version>
</parent>
<!-- Add typicaldependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/libs-snapshot</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/libs-snapshot</url>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.运行
第一种方式
通过在UserController中加上@EnableAutoConfiguration开启自动配置,然后通过SpringApplication.run(UserController.class);运行这个控制器;这种方式只运行一个控制器比较方便;
代码如下:
@RestController
@EnableAutoConfiguration
public class Application {
@RequestMapping("user")
public static StringSayHello() {
return"Hello Word!";
}
public static voidmain(String[] args){
SpringApplication.run(Application.class,args);
}
}
第二种方式
通过@Configuration+@ComponentScan开启注解扫描并自动注册相应的注解Bean
代码如下:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static voidmain(String[] args){
SpringApplication.run(Application.class,args);
}
将工程打包成独立运行jar包
进入cmd 定位到项目目录下然后执行 mvn clean package –DskipTests
然后会在项目的target文件夹下出现jar包例如(spingboot-demo-0.0.1-SNAPSHOT.jar)
然后再cmd 的C盘 用户目录下执行命令$ java –jar (jar包的目录)E:\program\spingboot-demo\target\spingboot-demo-0.0.1-SNAPSHOT.jar
回车运行会有如下图
出现下图表示运行成功
然后在浏览器中输入端口号和地址进行访问。
这就立马能够明白spring boot 的优势了,直接一个jar 包和java 环境就能运行web 项目了
遇到的问题:端口占用问题
运行独立jar 包时可能会出现端口占用问题,springboot 的内嵌tomcat 的端口是8080 这个端口可能会被oracle (我就是)占用或者 tomcat(默认8080)占用所以我们要重新配置内嵌tomcat的端口号步骤如下
1. 在resource 目录下新建application.properties 文件(文件名一定要application.properties 因为这个是默认的配置,如果文件名字不是这个则需要手动的添加识别)配置如下图