一、SpringBoot简介
1.1 概念
- 随着动态语言的流程(Ruby,Node.js),Java的开发显得格外笨重:配置繁多、开发效率低、项目部署复杂以及集成第三方技术难度大。
- 在这种情况下,SpringBoot就应运而生。采用"习惯优于配置/约定大于配置"的理念让项目可以快速的运行起来(将大量的约定俗成的习惯性配置内置到项目中,我们无需再手动配置)。
- 使用SpringBoot可以很容易的创建一个能够独立运行的准生产级别的基于Spring框架的项目,使用SpringBoot你可以不用或者很少进行Spring配置。
- SpringBoot采用了
习惯优于配置
的理念快速的搭建项目开发环境,我们无需或者很少进行相关的Spring配置就能够快速的将项目运行起来。
1.2 优点
- 快速的构建项目
- 对主流的开发框架都提供无配置集成(SpringBoot内置了配置,无需手动配置)
- 项目可以独立运行、无需依赖servlet容器(内置了servlet容器)
- 极大提高了开发、部署效率
- 提供了运行时监控系统
- 与云计算有天然的集成
1.3 缺点
- 版本迭代速度很快,一些模块改动较大
- 由于配置都是内置的,报错时很难定位
- 互联网上现成的解决方案资源并不多
二、第一个SpringBoot应用
2.1 File–New–Project
2.2 填写项目信息
2.3 选择项目依赖及SpringBoot版本
2.4 指定项目存储路径
2.5 pom.xml
-
parent:继承了Spring Boot的parent,表示此应用就是一个SpringBoot工程
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
-
starter POM:内置的应用场景,只要在依赖中引入一个starter,那么这个场景所需的依赖都会被传递性的引入
2.6 运行项目
- 点击src目录下的SpringbootTestApplication类,点击运行按钮,即可运行
三、自定义启动banner
-
在 Spring Boot 启动的时候会有一个默认的启动图案
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.9.RELEASE)
-
我们在 src/main/resources 目录下新建一个 banner.txt,通过
http://patorjk.com/software/taag
网站生成字符串,将网站生成的字符复制到 banner.txt 中,再次运行这个程序
佛祖注释代码:
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
三、SpringBoot的全局配置
3.1 创建SpringBoot应用
3.1.1 使用IDEA的Spring Initializr
限制:如果网络不够流畅,会导致Spring Initializr无法加载,此时我们就可以在线生成SpringBoot应用
3.1.2 使用在线生成SpringBoot应用
3.2 全局配置文件
-
SpringBoot项目使用了一个全局配置文件application.properties进行项目相关的配置
-
如果SpringBoot默认的设置无法满足我们的需求,就可以在application.properties来进行修改
# application.properties文件中的配置的 key 必须遵守 SpringBoot的要求 server.port=9090 server.servlet.context-path=/test
-
全局配置文件的格式也支持yml,并且在企业开发中通常使用yml格式进行配置(yaml语言),与properties对比如下:
-
application.properties
server.port=9090 server.servlet.context-path=/test spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-
application.yml
server: port: 9090 servlet: context-path: /test spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver
-
四、Java 配置方式
4.1 如何将一个类配置给Spring容器进行管理呢 ?
-
xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="com.zy.springboot.test.beans.User"></bean> </beans>
-
注解配置
@Component public class User { //... }
-
Java配置
@Configuration public class SpringConfig { @Bean public Date getDate(){ return new Date(); } }
4.2 Spring版本发展
- Spring 1.x
- 所有bean的配置都必须在xml中完成
- Spring 2.x
- 基于JDK 1.5对注解的支持,Spring2.x开始使用注解配置
- 企业开发中到时是使用xml还是注解呢 ?
- 应用的基本配置用xml,比如:数据源、事务
- 业务开发方面使用注解,比如:service、controller
- Spring 3.x
- 开始提供了基于Java的配置方式
- Spring 4.x
- Spring Boot 和Spring4.x 都提倡使用Java配置方式
五、Starter POM
Starter POM,指的是在pom文件中配置的SpringBoot提供的starter
-
一个Starter我们就可以理解为对一种开发场景的支持
-
SpringBoot为我们提供了简化企业级开发绝大多数场景的支持(多个StarterPOM),在我们的项目中只要使用了对应场景的StarterPOM,相关的技术配置就会被内置进来(消除人工配置),同时我们就可以获得SpringBoot为我们提供的内置的Bean。
-
案例: redis
-
在pom.xml中引入redis对应的starter
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
在service中就可以直接使用SpringBoot内置的基于redis的开发场景(直接使用Bean)
@Service public class RedisService { @Resource private RedisTemplate redisTemplate; }
-
-
SpringBoot支持绝大多数的主流框架(提供对应的starter),但并不是所有;支持的主流框架如下:
六、SpringBoot的自动配置
6.1 运行SpringBoot应用的启动类
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
//SpringApplication.run 启动一个SpringBoot应用
//run传递的class对象需要有 @SpringBootApplication 注解,
//SpringBoot应用的加载是从@SpringBootApplication开始
SpringApplication.run(SpringbootTestApplication.class, args);
}
}
- @SpringBootApplication注解:是一个组合注解,包括配置、自动配置、扫描功能的启动
6.2 SpringApplication
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
// Class[] primarySources ------------ SpringbootTestApplication.class
// 相当于SpringbootTestApplication.class-->SpringApplication然后调用run方法
return (new SpringApplication(primarySources)).run(args);
}
//相当于用SpringbootTestApplication.class调用的此run方法,此run方法中的this就表示我们自己的应用
public ConfigurableApplicationContext run(String... args) {
//...
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
//...
// 获取我们自己的应用程序的Spring对象工厂实例
exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
//...
}
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
//...
Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
//...
}
6.3 SpringFactoriesLoader
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
//...
//加载Spring的自动配置文件:
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
//...
}