原先的Spring程序缺点,包括依赖设置繁琐,每项jar的引用都需要自己撰写。并且配置繁琐,配置文件中也需要自己写加载bean等。由此针对原始的Spring程序,Pivotal团队提供的全新框架——SpringBoot,其设计目的是用来简化Spring应用的初始搭建以及开发过程。
在进行开发时,对依赖版本具有固定搭配,故SpringBoot将所有基本版本常见的方案进行了整理,开发者可直接使用其提供的版本方案,不用担心冲突。故SpringBoot提供了parent,parent自身具有很多个版本,每个parent版本中包含有几百个其他技术的版本号。parent帮助开发者统一的进行各种技术的版本管理。
注意: parent定义出来以后,并不是直接使用,仅仅是给开发者一个说明书。
总结:继承spring-boot-starter-parent,其中定义了若干个依赖管理。继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突。
在pom.xml文件中,继承了一个spring-boot-starter-parent的坐标

打开后可以查阅到其中又继承了一个spring-boot-dependencies的坐标

打开 spring-boot-dependencies ,可以看到其 properties 下,列出了各式各样的依赖版本号属性,定义了若干个技术的依赖版本号。

而后的 dependencyManagement 中,列出了依赖坐标信息,其中依赖没有具体的依赖版本号,而是引用了上面定义的依赖版本属性值

在实际开发时,对于依赖坐标的使用往往都有一些固定的组合方式,繁琐且格式固定,没有技术含量。由此SpringBoot提供了starter,定义了使用某种技术时对于依赖的固定搭配格式,一次配置就可引入一组依赖,使用starter可以帮助开发者减少依赖配置
命名规则:spring-boot-starter-技术名称
注意:
spring-boot-starter-web 。
spring-boot-starter-web 后,可以看到其又定义了若干个具体依赖的坐标
SpringBoot程序运行的入口就是工程创建时自带的,带有main方法的类,运行这个类就可以启动SpringBoot工程的运行。
package com.ty;
import com.ty.controller.DemoController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}
pringBoot本身是为了加速Spring程序的开发的,而Spring程序运行的基础是需要创建自己的Spring容器对象(IoC容器)并将所有的对象交给Spring的容器管理,也就是 Bean。当前SpringBoot启动类运行后就会产生一个Spring容器对象,通过容器对象直接操作Bean。
package com.ty;
import com.ty.controller.DemoController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringbootDemoApplication.class, args);
DemoController bean = run.getBean(DemoController.class);
System.out.println(bean);
}
}
1.4.1 定位tomcat
在 SpringBoot 中,引入了 spring-boot-starter-web ,当打开 spring-boot-starter-web 便能看到,又引入了 spring-boot-starter-tomcat ,再打开这个starter,其中的 tomcat-embed-core,叫做tomcat内嵌核心,便是这个奖tomcat功能引入到了我们SpringBoot项目中。

1.4.2 更换内嵌Tomcat
SpringBoot提供了3款内置的服务器
tomcat(默认):apache出品,粉丝多,应用面广,负载了若干较重的组件
jetty:更轻量级,负载性能远不及tomcat
undertow:负载性能勉强跑赢tomcat
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
总结
SpringBoot支持的配置文件:
properties格式:
server.port=80
yml格式:
server:
port: 81
yaml格式:
server:
port: 82
2.3.1 Environment 读取全部配置数据
application.yml 中配置:
datasource:
driver: com.mysql.jdbc.Dirver
url: jdbc:mysql://localhost/springboot_db
username: root
password: 123
直接通过自动装配注解,将配置文件中的配置数据封装到 Environment 对象中。
package com.ty.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/demo")
public class DemoController {
@Autowired
private Environment environment;
@GetMapping
public String getByIds(){
String id = "TY Demo SpringBoot is Running...";
System.out.println(id);
System.out.println("Driver" + environment.getProperty("driver"));
System.out.println("Url" + environment.getProperty("url"));
System.out.println("Username" + environment.getProperty("username"));
System.out.println("Password" + environment.getProperty("password"));
return id;
}
}
2.3.2 @ConfigurationProperties 读取配置对象数据
SpringBoot 可将一组配置数据封装为一个Java对象。
application.yml 中配置:
datasource:
driver: com.mysql.jdbc.Dirver
url: jdbc:mysql://localhost/springboot_db
username: root
password: 123
首先定义一个配置参数封装类,使用注解 @ConfigurationProperties,指定对象加载的配置文件中的信息。@ConfigurationProperties 必须告诉他加载的数据前缀,这样当前前缀下的所有属性就封装到这个对象中。
package com.ty;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties(prefix = "datasource")
public class MyDataSource {
private String driver;
private String url;
private String username;
private String password;
@Override
public String toString() {
return "MyDataSource{" +
"driver='" + driver + '\'' +
", url='" + url + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
直接通过自动装配注解,引入 MyDataSource对象。
package com.ty.controller;
import com.ty.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/demo")
public class DemoController {
@Autowired
private Environment environment;
@Autowired
MyDataSource myDataSource;
@GetMapping
public String getById() {
String id = "TY Demo SpringBoot is Running...";
System.out.println(id);
System.out.println("Driver" + myDataSource.getDriver());
System.out.println("Url" + myDataSource.getUrl());
System.out.println("Username" + myDataSource.getUsername());
System.out.println("Password" + myDataSource.getPassword());
return id;
}
}