0%

SpringBoot学习

Spring Boot makes it easy to create stand-alone, production-grade Spring-based Applications that you can run.

1. 常见注解

@RequestMapping (@GetMapping & @PostMapping)

The @RequestMapping annotation provides “routing” information. It tells Spring that any HTTP request with the / path should be mapped to the home method.
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。

@RestController

The @RestController annotation tells Spring to render the resulting string directly back to the caller.
等价于 @Controller + @ResponseBody,为了使Http请求返回数据格式为json格式。

@EnableAutoConfiguration

Since spring-boot-starter-web added Tomcat and Spring MVC, the auto-configuration assumes that you are developing a web application and sets up Spring accordingly.

@ConditionalOnProperty

可以用来控制配置是否生效。

@SpringBootApplication

The @SpringBootApplication annotation is often placed on your main class, and it implicitly defines a base “search package” for certain items. same as @Configuration,@EnableAutoConfiguration,@ComponentScan.

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}

@Configuration

Declare the configuration Classes.

@EnableAutoConfiguration

If you find that specific auto-configuration classes that you do not want are being applied, you can use the exclude attribute of @EnableAutoConfiguration to disable them.

1
2
3
4
5
6
7
8
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

@EnableConfigurationProperties 和 @ConfigurationProperties

这两个注解的作用可以参见 Spring Boot 官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
@ConfigurationProperties
public class UriConfigurationProperties {
private String httpbin = "http://httpbin.org:80";

public String getHttpbin() {
return httpbin;
}

public void setHttpbin(String httpbin) {
this.httpbin = httpbin;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package org.spring.cloud.gateway;

import org.spring.cloud.gateway.properties.UriConfigurationProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;

@SpringBootApplication

//@EnableConfigurationProperties(org.spring.cloud.gateway.properties.UriConfigurationProperties.class)
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class, args);
}

@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder, UriConfigurationProperties uriConfiguration) {
String httpUri = uriConfiguration.getHttpbin();
return builder.routes()
.route(p -> p
.path("/get")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri(httpUri))
.route(p -> p
.host("*.hystrix.com")
.filters(f -> f
.hystrix(config -> config
.setName("mycmd")
.setFallbackUri("forward:/fallback")))
.uri(httpUri))
.build();
}
}

上述两个文件位于两个包下,如果在第一个文件中使用了@Component,则在第二个文件中就不能再使用@EnableConfigurationProperties注解,否则将会报错,提示有两个Bean。
如果第一个文件没有使用@Component则第二个文件可以将注释去掉。

单元测试常用注解

@RunWith(SpringJUnit4ClassRunner.class)

引入Spring对JUnit4的支持。

@SpringApplicationConfiguration(classes = HelloApplication.class)

指定SpringBoot的启动类

@WebAppConfiguration

开启Web应用配置,用于模拟ServletContext

@Before & @Test & @After

@Before:JUnit中定义在测试用例@Test内容执行前预加载的内容,同理判断。

2. Starter POMs

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

命名规则都是spring-boot-starter-代表一个特别的应用功能模块。

spring-boot-starter-web

全栈Web开发模块,包含嵌入式的Tomcat、SpringMVC

spring-boot-starter-test

包含Junit、Hamcrest、Mockito

spring-boot-starter-actuator

为SpringBoot构建的应用提供一系列用于监控的端点。
访问:http://127.0.0.1:8080/actuator
可以看到输出了如下JSON文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"_links": {
"self": {
"href": "http://127.0.0.1:8080/actuator",
"templated": false
},
"health": {
"href": "http://127.0.0.1:8080/actuator/health",
"templated": false
},
"health-component": {
"href": "http://127.0.0.1:8080/actuator/health/{component}",
"templated": true
},
"health-component-instance": {
"href": "http://127.0.0.1:8080/actuator/health/{component}/{instance}",
"templated": true
},
"info": {
"href": "http://127.0.0.1:8080/actuator/info",
"templated": false
}
}
}

spring-boot-devtools

(1) Property Defaults
(2) Automatic Restart
(3) LiveReload
(4) Global Settings
(5) Remote Applications

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

配置文件

SpringBoot的默认配置文件位置是src/main/resources/application.properties.

1
2
3
<!-- application.properties -->
book.name=JAVA编程思想
book.author=Bruce Eckel

应用中可以使用 @Vlaue注解来加载这些自定义的参数

1
2
3
4
5
6
7
@Component
public class Book {
@Value("${book.name}")
private String name;
@value("${book.author}")
private String author;
}

Java代码中引用有以下两种方式:

  1. PlaceHolder方式 ${…}
  2. SpEL表达式 #{…}

通过application-{profile}多环境配置文件:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
在application.properties中的spring.profiles.active属性来设置。

1
2
// 调用测试环境
spring.profiles.active = test;

在采用java -jar xxx.jar 形式运行项目时,”–”就是对application.properties中的属性值进行赋值的标识。
配置文件的优先级顺序如下:
命令行输入 > 包外 > 包内
所以可以在利用这一点来对配置进行快速准确的更改。

spring.factories文件

Spring Factories实现原理(package org.springframework.core.io.support包下的SpringFactoriesLoader.class文件;)
Spring 容器初始化时会加载该文件声明的类,我们可以通过@SpringBootApplication->@EnableAutoConfiguration->AutoConfigurationImportSelector->getCandidateConfigurations->SpringFactoriesLoader
spring-core包里定义了SpringFactoriesLoader类,这个类实现了检索META-INF/spring.factories文件,并获取指定接口的配置的功能。在这个类中定义了两个对外的方法:

loadFactories: 根据接口类获取其实现类的实例,这个方法返回的是对象列表。
loadFactoryNames: 根据接口获取其接口类的名称,这个方法返回的是类名的列表。

bootstrap.yml和appllication.yml的区别

bootstrap.yml加载(父SpringApplicationContext)顺序在application.yml之前,用于应用程序上下文的引导阶段。用于指定spring.application.name和spring.cloud.config.server.git.uri以及一些加密和解密信息。
eg:Spring Cloud Config 配置中心再使用时,通常将访问远程文件配置信息写在bootstrap.yml文件中。