1、Spring boot概要
Spring boot介绍
随着动态语言的流行(Ruby、Scala、Node.js), Java的开发显得格外的笨重;繁多的配置、低下的开发效率、 复杂的部署流程以及第三方技术整合难度大。 在上述环境下,Spring Boot由此诞生,它的设计是为了使您能够尽可能快地启动和运行。它使用 “习惯优于配 置” (项目中存在大量的配置,而 Spring Boot 内置一个习惯性的配置,让你无须手动进行配置)的理念让你的 项目快速运行起来。使用 Spring Boot 很容易创建一个独立运行(运行jar,内嵌 Servlet 容器)、准生产强力 的基于 Spring 框架的项目,使用 Spring Boot你可以不用或者只需要很少的 Spring 配置。提供了 J2EE 开发的 一站式解决方案。
Spring boot优点
1.快速构建独立运行的Spring项目;
2.无须依赖外部Servlet容器,应用无需打成WAR包;项目可以打成jar包独自运行;
3.提供 一系列 starter pom 来简化 Maven 的依赖加载;
4.大量的自动配置,对主流开发框架的无配置集成;
5.无须配置XML,开箱即用,简化开发,同时也可以修改默认值来满足特定的需求;
6.Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式;
7.极大提高了开发、部署效率。
2、Spring boot快速入门
2.1 pom.xml配置文件
在 pom.xml 中添加的 Spring Boot 相关的父级依赖,spring-boot-starter-parent 是一个特殊的starter,它提供了项目相关的默认依赖,使用它之后 ,常用的包依赖可以省去 version 标签。
2.2 引导类
通常有一个名为 *Application
的入口 类,里面定义一个main方法,使用SpringApplication.run(HelloMailAppliation.class, args);
来启动 SpringBoot 应用项目。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HellospringbootApplication {
public static void main(String[] args) {
SpringApplication.run(HellospringbootApplication.class, args);
}
}
@SpringBootApplication
注解说明:
标注在某个类上, 说明这个类是 Spring Boot 的引导类,Spring Boot 就应该运行这个类的main方法来启动 SpringBoot 应用。
@SpringBootApplication
注解是以下三个注解的总和:
@SpringBootConfiguration
:用于定义一个Spring Boot的配置类( 配置类 等同 配置文件)引用了@Configuration 注解,是Spring底层的一个注解,用于定义 Spring 的配置类。配置类也是容器中的一个组件@Component。
@EnableAutoConfiguration
:告诉Spring Boot开启自动配置功能,这样Spring Boot会自动根据你导入的依赖jar包来自动配置项目。
@AutoConfigurationPackage ——> @Import({Registrar.class}):
会将引导类(@SpringBootApplication标注的类)所在的包及下面所有子包里面的所有组件扫描到Spring容器;
@Import({AutoConfigurationImportSelector.class}):
1.将所有需要导入的组件以全类名的方式返回; 这些组件就会被添加到容器中;
2.会给容器导入非常多的自动配置类(xxxxAutoConfiguration),就是导入并配置好当前项目中所需要的组件,省去我们手动编写配置去注入组件。
Spring Boot在启动的时候从(spring-boot-autoconfigure-2.0.6.RELEASE.jar)类路径下的METAINF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的文件,自动配置类都帮我们完成了;
@ComponentScan
:该注解标识的类, 会被 Spring 自动扫描并且装入bean容器。
2.3 目录结构
resources 文件夹中目录结构:
static
:保存所有的静态资文件, js css images
templates
:保存所有的模板页面(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面),可以使用模板引擎(freemarker、thymeleaf);
application.properties
:Spring Boot应用的配置文件;可以修改一些默认设置;如修改默认端口 server.prot=8081。
2.4 Spring boot的配置文件
Spring Boot 使用一个全局配置文件,放置在 src/main/resources
目录或类路径的/config
下;
- application.properties
- application.yml
配置文件的作用:修改 Spring Boot 自动配置的默认值。
yml 是 YAML(YAML Ain’t Markup Language)不是一个标记语言;
- 标记语言:以前的配置文件;大多都使用的是 xxxxx.xml文件;
- YAML:以数据为中心,配置数据的时候具有面向对象的特征;比 json、xml 等更适合做配置文件;
2.5 YAML语法格式
YAML基本语法:
key: value
表示一对键值对(冒号后面必须要有空格)- 使用空格缩进表示层级关系
- 左侧缩进的空格数目不重要,只要同一层级的元素左侧对齐即可
- key 与 value 大小写敏感
YMAL常用写法: - 字面量: 数值,字符串,布尔,日期
- 字符串 默认不用加上引号;
- 使用 双引号"" 不会转义特殊字符,特殊字符最终会转成本来想表示含义输出。
name: "mengxuegu \n jiaoyu"
输出:mengxuegu 换行 jiaoyu"
- 使用 单引号 会转义特殊字符,特殊字符当作一个普通的字符串输出
name: 'mengxuegu \n jiaoyu
输出:mengxuegu \n jiaoyu
- 使用 双引号"" 不会转义特殊字符,特殊字符最终会转成本来想表示含义输出。
- 字符串 默认不用加上引号;
- 对象 & Map
key: value
value存储对象,每个值换一行写,注意值要左对齐
- 行内写法
- 数组(List、Set)
- 用
- 值
表示数组中的一个元素
- 行内写法
- 用
2.6 yaml 配置文件注入值
- 编写 application.yml 配置文件:
server:
port: 80
#emp的配置数据
emp:
name: korbin
age: 21
map:
key1: value1
key2: value2
list:
- one
- two
- three
forte:
name: java
time: 8
- 编写 JavaBean:添加get、set方法和
@Component
、@ConfigurationProperties(prefix = "emp")
注解
- 使用 SpringBoot 单元测试类进行测试
import cn.korb1n.hellospringboot.bean.Emp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class HellospringbootApplicationTests {
@Autowired
private Emp emp;
@Test
public void contextLoads() {
System.out.println(emp);
}
}
- 导入配置文件处理器,然后重新运行测试类,在编写配置文件时就会有代码提示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Value
与 @ConfigurationProperties
获取值的差异:需要批量注入配置文件的属性值时用后者,需要指定单个属性值时用前者。
2.7 加载指定配置文件
2.7.1 @PropertySource加载局部配置文件
@ConfigurationProperties
默认从全局配置文件(application.properties/application.yml)中获取值,所有配置数据写在全局配置文件中,显得太臃肿了, 可将它们抽取出来,放到其他局部配置文件中。
@PropertySource
:用于加载局部配置文件;-
将 全局配置文件 中的emp相关配置数据 抽取 到 resources/ emp.properties 文件中
#emp的配置数据 emp.name=korbin emp.age=21 emp.map.key1=value1 emp.map.key2=value3 emp.list=one,two,three emp.forte.name=java emp.forte.time=10
-
添加注解
@PropertySource(value = {"classpath:emp.properties"})
:加载指定的配置文件; value 属性是数组类型,用于指定配置文件位置。
-
2.7.2 @ImportResource使用xml配置
SpringBoot提倡零配置, 即无xml配置,但是在实际开发中,可能有一些特殊要求必须使用 xml 配置;这时我们可以通过 Spring 提供的@ImportResource 来加载 xml 配置文件。
@ImportResource
:加载Spring的xml配置文件内容加载到容器中使用;- 创建业务类: EmpService.class
public class EmpService { public void add(){ } }
- 创建 resources/spring01.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="empService" class="cn.korb1n.hellospringboot.bean.Emp"></bean> </beans>
- 将Spring的配置文件加载到容器中, 使用
@ImportResource
标注在一个配置类上,下面是主配置类import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @ImportResource(locations = {"classpath:spring01.xml"}) @SpringBootApplication public class HellospringbootApplication { public static void main(String[] args) { SpringApplication.run(HellospringbootApplication.class, args); } }
- 单元测试
package cn.korb1n.hellospringboot; import cn.korb1n.hellospringboot.bean.Emp; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class HellospringbootApplicationTests { @Autowired private ApplicationContext applicationContext; @Test public void testXml(){ //没有找到就报错 System.out.println("empService:"+applicationContext.getBean("empService")); } @Autowired private Emp emp; @Test public void contextLoads() { System.out.println(emp); } }
- 创建业务类: EmpService.class
2.7.3 自定义配置类向容器注入组件
Spring Boot 推荐使用注解的方式向容器中注入组件, 操作如下:
- 使用
@Configuration
配置类,来表示对应Spring配置文件 - 使用 @Bean 向容器中注入组件对象
- 把 上面
@importResource
注解注释掉测试
package cn.korb1n.hellospringboot.config;
import cn.korb1n.hellospringboot.service.EmpService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Configuration 用于标识当前类是一个配置类, 来表示对应的Spring配置文件
*/
@Configuration
public class EmpConfig {
/** @Bean 标识的方法用于向容器注入组件
* 1. 方法的返回值就是注入容器中的组件对象,
* 2. 方法名是这个组件对象的 id 值
*/
@Bean
public EmpService empService2() {
System.out.println(" @Bean 注解已经将 EmpService 组件注入");
return new EmpService();
}
}
- 再次测试
package cn.korb1n.hellospringboot;
import cn.korb1n.hellospringboot.bean.Emp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class HellospringbootApplicationTests {
@Autowired
private ApplicationContext applicationContext;
@Test
public void testXml(){
//没有找到就报错
System.out.println("empService:"+applicationContext.getBean("empService2"));
}
}
2.8 Spring boot日志配置
Spring Boot采用了 slf4j+logback 的日志框架组合形式,Spring Boot也提供对JUL、log4j2、Logback提供了默认配置。
官网参考文档:https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#boot-features-logging
- SpringBoot默认配置好了日志, 只要启动 Spring Boot 项目就会在控制台输出日志信息。
- 修改日志默认级别:
#调整日志级别: trace < debug < info < warn < error logging: level: #cn.korb1n.hellospringboot包下的级别 cn.korb1n.hellospringboot: trace #设置root级别 root: info
- 修改日志文件生成路径:
logging.file logging.path 示例 说明 (none) (none) 只在控制台输出 指定文件名 (none) springboot.log 输出到当前项目根路径下的springboot.log文件中 (none) 指定目录 /springboot/log 输出到当前项目所在磁盘根路径下的/springboot/log目录中的spring.log文件中 指定文件名 指定目录 当两个同时指定时,采用的是 logging.file 指定。推荐使用 logging.file 设置即可,因为它可以自定义文件名 logging: #输出到当前项目根路径下的 springboot.log 文件中 file: springboot.log #输出到当前项目所在磁盘根路径下的 /springboot/log目录中的 spring.log 文件中, #path: springboot/log