SpringBoot是用来简化Spring应用开发的,约定大于配置,去繁从简
产生的背景:J2EE笨重的开发,繁多的配置,低下的开发效率,复杂的部署流程,第三方技术集成难度大;
解决的问题:Spring全家桶时代,SpringBoot->J2EE一站式解决方案,SpringCloud->分布式微服务整体解决方案;
优点:
快速创建独立运行的Spring项目以及主流框架集成
使用嵌入式Server容器,应用无需打包成WAR包
starters自动一来与版本控制
大量的自动配置,简化开发,也可以修改默认值
无需配置XML,无代码生成,开箱即用
准生产环境的运行时应用监控
与云计算的天然集成
缺点:
入门容易精通难
搭建SpringBoot工程
IDEA:File–>new Project–>Maven;点点点
1.打开pom文件,导入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>
2.创建SpringBoot的启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/*
标注一个主程序类,说明这是一个SpringBoot应用
*/
@SpringBootApplication
public class HelloworldMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloworldMainApplication.class,args);
}
}
3.创建Controller控制器
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller//标注这是一个控制器类
public class HelloController {
@ResponseBody//标注返回的数据为JSON
@RequestMapping("/hello")//标注这是一个请求
public String hello(){
return "HelloWorld!!!";
}
}
4.本地访问
5.打包运行
先确保安装java运行环境
在mavan中安装打包jar的插件
<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>
<!--打包插件,可以将应用打包成可执行的jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
停止运行idea的项目避免8080端口占用导致jar启动不了
点击package
大好的jar包会生成在target目录中
将包拖出来使用java -jar 包名直接cmd启动
cmd运行记得找对路径 cd进目录,dir查看目录
本地测试一下jar包运行
效果一样!!!这个demo中并没有Tomcat容器,我的笔记本中也没有安装,这是在打包成jar的时候自动将Tomcat容器打包到demo工程里面了
这里我们来看看jar包里面都有些啥!
lib中确实有Tomcat的jar包,这里只需要简单编写主启动类和controller就能实现服务端代码的运行,这些表面简单的活背后都是交给SpringBoot这个框架去处理了,这里我们到pom文件
看到这行代码,点进去
依赖版本控制器
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>//点这个
<version>1.5.9.RELEASE</version>
</parent>
进入后会发现这个父依赖还有一个依赖,那么我们在点进去
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>//点这个
<version>1.5.9.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
进入后就会看到SpringBoot携带的所有依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<packaging>pom</packaging>
<name>Spring Boot Dependencies</name>
<description>Spring Boot Dependencies</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<scm>
<url>https://github.com/spring-projects/spring-boot</url>
</scm>
<developers>
<developer>
<id>pwebb</id>
<name>Phillip Webb</name>
<email>pwebb at pivotal.io</email>
<organization>Pivotal Software, Inc.</organization>
<organizationUrl>http://www.spring.io</organizationUrl>
<roles>
<role>Project lead</role>
</roles>
</developer>
<developer>
<id>dsyer</id>
<name>Dave Syer</name>
<email>dsyer at pivotal.io</email>
<organization>Pivotal Software, Inc.</organization>
<organizationUrl>http://www.spring.io</organizationUrl>
<roles>
<role>Project lead</role>
</roles>
</developer>
</developers>
//这个文件太长了,就不显示上来了
这个可以理解为这是SpringBoot版本控制中心,只要在父项目中指定SpringBoot的版本,导入其他依赖时就不需要手动填写版本,那么这个版本控制器就会帮我们控制所有的依赖版本,避免版本兼容性问题造成代码冲突!但是如果没有在版本控制器中的依赖则需要手动填写版本号!
依赖导入-依赖传递
这个demo中实际上我们手动自导入了这一个依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>//点这个
</dependency>
</dependencies>
这个依赖叫做spring-boot-starter:spring-boot场景启动器,我们进入看看
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<artifactId>spring-boot-starter-web</artifactId>
<name>Spring Boot Web Starter</name>
<description>Starter for building web, including RESTful, applications using Spring
MVC. Uses Tomcat as the default embedded container</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
</project>
spring-boot-starter-web:这个场景启动器是web场景用的,会帮我们自动导入web的依赖,这也就是我们没有导入Tomcat的依赖,却在jar的解压包中能看到的原因,这里的lib中的jar包可以单独拖出来使用哦!
像这样的场景启动器Springboot提供了很多,SpringBoot将这些功能场景都抽取出来,做成starter启动器供我们开发使用,开发的时候只需要在项目里面引入这些starter场景启动器就可以将相关依赖全部导入进来,就连版本都控制好了;
下面我们来剖析一下SpringBoot启动类的代码
@SpringBootApplication
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/*
标注一个主程序类,说明这是一个SpringBoot应用
*/
@SpringBootApplication
public class HelloworldMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloworldMainApplication.class,args);
}
}
@SpringBootApplication:SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个累的main方法来启动SpringBoot应用,
@SpringBootApplication这个注解其实是一个组合注解,我们点解这个注解进去看看
@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:配置类上来标注这个注解
配置类--->配置文件;配置类也是容器中的一个组件@Component
@EnableAutoConfiguration:开启自动配置功能;
以前我们需要配置的东西,SpringBoot帮我们自动配置,这个注解是开启自动配置功能的这样自动配置才能生效
这个注解里面又有一个@AutoConfigurationPackage注解,
@AutoConfigurationPackage:这个注解是自动配置包的
@Import(AutoConfigurationPackages.Registrar.class):Spring的底层注解@import,给容器导入一个组件,导入的组件由AutoConfigurationPackages.Registrar.class,将主配置类(@SpringBootApplication标注的类)所在的包以及下面所有的子包里面的所有组件扫描到Spring容器;
@Import(EnableAutoConfigurationImportSelector.class)
EnableAutoConfigurationImportSelector.class:导入那些组件选择器;
将所有需要导入的组件以全类名的方式返回,这些组件就会添加到容器中;
会给容器中导入非常多的配置类,并配置好这些组件
、
有了这些自动配置类,免去了我们手动编写配置租借功能组件的工作;
SpringFactionLoader.loadFactortNames(EnableAutoConfiguration.class,classLoader);
SpringBoot在启动的时候会在类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置的工作,以前我们需要自己配置的东西,自动配置帮我们完成了;
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar中