初识SpringBoot
SpringBoot的优点
- 为所有Spring开发者更快的入门
- 开箱即用,提供各种默认配置来简化项目配置
- 内嵌式容器简化Web项目
- 没有冗余代码生成和XML配置的要求
spring boot 致力于简洁,让开发者写更少的配置,程序能够更快的运行和启动。它是下一代javaweb框架,并且它是spring cloud(微服务)的基础。
SpringBoot和SpringMVC区别
SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC是控制层。
SpringBoot和SpringCloud区别
SpringBoot专注于快速方便的开发单个个体微服务。
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、精选决策、分布式会话等集成服务。
SpringBoot可以离开SpringCloud独立开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
SpringBoot快速搭建
环境准备
JDK1.8
IntelliJ IDEA
springboot 2.1.3
apache-maven-3.6.0
搭建过程
1. 打开idea,创建一个新项目,选择maven,选择jdk,点击下一步
2. 引入pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies> <!-- SpringBoot web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
spring-boot-starter-parent作用
它可以提供dependency management,也就是说依赖管理,引入以后在申明其它dependency的时候就不需要version了(没有在dependencies里面管理的依赖自然需要声明版本号)
spring-boot-starter-web作用
spring-boot-starter-web:默认使用嵌套式的Tomcat作为Web容器对外提供HTTP服务,默认端口8080对外监听和提供服务。
spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;
Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面
引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。
Spring Boot Reference Guide
https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html
single/
3. 创建启动类,启动项目
@SpringBootApplication
@RestController
public class HelloSpringboot {
@RequestMapping("/hello")
public String hello() {
return "hello spring boot !!!";
}
public static void main(String[] args) {
// 启动第一个springboot应用
SpringApplication.run(HelloSpringboot.class, args);
}
}
@SpringBootApplication
标注在某个类上,说明这个类是SpringBoot的主配置类,SpringBoot运行这个
类的main方法来启动SpringBoot应用;
@EnableAutoConfiguration:开启自动配置功能; @AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class):给容器中导入组件;
将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;
@RestController
意味着这个Controller的所有方法上面都加了@ResponseBody
4. 打开浏览器,输入地址测试结果。
静态资源访问配置
默认配置
在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。
Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
- classpath:/static
- classpath:/public
- classpath:/resources
- classpath:/META-INF/resources
举例:我们在src/main/resources目录下新建 public、resources、static 三个目录,并分别放入1.jpg 2.jpg 3.jpg 三张图片。然后通过浏览器分别访问:
- http://localhost:8080/1.jpg
- http://localhost:8080/2.jpg
- http://localhost:8080/3.jpg
地址均可以正常访问,Spring Boot 默认会从 public resources static 三个目录里面查找是否存在相应的资源。
在application.properties配置
# 静态文件请求匹配方式 spring.mvc.static-path-pattern=/erha/**
# 修改默认的静态寻址资源目录 多个使用逗号分隔 spring.resources.static-locations = classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/mytest/
配置中配置了静态模式为/erha/**,访问时候就只能通过/erha/xx 来访问。
访问地址:http://localhost:8080/erha/1.jpg
自定义静态资源地址
@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
// http://localhost:8080/mystatic/abc.jpg
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mystatic/**").addResourceLocations("classpath:/mysta tic/");
}
}
访问地址:http://localhost:8080/mystatic/abc.jpg
这个方法跟在配置文件中类似,区别是一个在properties文件中配置,一个是在java类中配置。
全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({ArithmeticException.class})
@ResponseBody
public Map<String, Object> handleArithmeticException(ArithmeticException e) {
Map<String, Object> map = new HashMap<String, Object>();
e.printStackTrace();
map.put("errorCode", "201");
map.put("errorMsg", "算数异常"); return map;
}
@ExceptionHandler(Exception.class)
@ResponseBody
public Map<String, Object> handlerException(Exception e) {
e.printStackTrace();
Map<String, Object> map = new HashMap<String, Object>();
map.put("errorCode", "101");
map.put("errorMsg", "未知异常");
return map;
}
}
通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。
- @ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上
- @ExceptionHandler:用于全局处理控制器里的异常。
SpringBoot配置文件
YAML基本格式要求
- YAML大小写敏感;
- 使用缩进代表层级关系;
- 缩进只能使用空格,不能使用TAB,不要求空格个数,只需要相同层级左对齐(一般2个或4个空格)
YAML语法
- k:(空格)v:表示一对键值对(空格必须有);
- 以空格的缩进来控制层级关系;
- 只要是左对齐的一列数据,都是同一个层级的
server:
port: 8080
path: /erha
属性和值:大小写敏感
值的写法
- 字面量:普通的值(数字,字符串,布尔)
- k: v:字面直接来写; 字符串默认不用加上单引号或者双引号;
- 对象、Map(属性和值)(键值对):
- k: v:在下一行写对象的属性和值的关系;注意缩进
friends: lastName: zhangsan age: 20
- 行内写法
friends: {lastName: zhangsan,age: 18}
- 数组(List Set)
- 使用一个短横线加一个空格代表一个数组项:
pets: - cat - dog - pig
- 行内写法
pets: [cat,dog,pig]
配置文件注入
-
YAML文件内容
user: lastName: hello age: 18 boss: false birth: 2017/12/12 maps: {qq: 1000 , mobile: 13811002233} lists: - lisi - zhaoliu dog: name: 小狗 age: 12 address: shanghai
-
properties
person.last-name=hello${user.lastName} person.age=${random.int} person.birth=2017/12/15 person.boss=false person.maps.aa=v1 person.maps.bb=14 person.lists=a,b,c person.dog.name=${person.hello:hello}_dog person.dog.age=15
-
随机值的使用
${random.value} 随机生成一个32位的字符串,如:b21d56d2f10d74f84608dfff01b25552 ${random.int} 随机生成一个int范围的随机数,如:-386223791 ${random.long} 随机生成一个long范围的随机数,如:2404587442488649534 ${random.int(10)} 随机生一个[0,10]之间的随机数,如:8 ${random.int[1024,65536]} 随机生成一个[1024,65536]之间的随机数,如:63856 ${user.userName} 获取配置文件中已经配置好的属性值,不存在时直接返回整个“${user.userName}” ${user.width:hello} 获取配置文件中已经配置好的属性值,不存在时则用"hello"返回
-
application.properties和application.yml同时存在
如果你在相同优先级位置同时有application.properties和application.yml, 那么application.yml 里面的属性就会覆盖application.properties里的属性。 yaml > properties
-
配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –file:./config/ –file:./ –classpath:/config/ –classpath:/ 优先级由高到底,高优先级的配置会覆盖低优先级的配置;
测试使用
指定bean对象
// 指定配置文件
@PropertySource(value = {"classpath:application.yml"})
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
测试
@Controller
public class YmlController {
@Autowired
User user;
@Value("${address}")
String address;
@Autowired
Person person;
@Value("${user.lastName}")
String lastName;
@Value("${password}")
String password;
@RequestMapping("/yml4")
@ResponseBody
public String yml4Test() {
return "profile = " + password;
}
@RequestMapping("/yml3")
@ResponseBody
public Person yml3Test() {
return person;
}
@RequestMapping("/yml2")
@ResponseBody
public String yml2Test() {
return "address = " + address + " lastName = " + lastName;
}
@RequestMapping("/yml")
@ResponseBody
public User ymlTest() {
return user;
}
}
profile环境切换
多profile
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml 默认使用
application.properties的配置;例如:
- application-dev.properties:开发环境
- application-test.properties:测试环境
- application-prod.properties:生产环境
激活指定profile
- 在配置文件中指定 spring.profiles.active=dev
- 命令行: java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
可以直接在测试的时候,配置传入命令行参数 - 虚拟机参数; -Dspring.profiles.active=dev