Spring官网:https://spring.io/projects
Spring Boot 是在Spring框架基础上创建的一个全新框架,是Spring项目中的一个子工程,与Spring-framework 同属于Spring的产品。
Spring Boot 称为搭建程序的脚手架 。其最主要作用是快速的构建庞大的Spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让开发者关注于业务而非配置。
Spring Boot 简化了基于Spring的应用开发,为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器starter),多数Spring Boot应用只需要很少的Spring配置。 Spring Boot 内置了tomcat,无需再单独配置tomcat。
Spring Boot 设计的目的是简化 Spring 应用的搭建和开发过程,它不但具有Spring的所有优秀特性,而且具有如下显著的特点:
Spring Boot 官网版本列表:https://spring.io/projects/spring-boot#learn
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.testgroupId>
<artifactId>spring-boot-ssmartifactId>
<version>1.0-SNAPSHOTversion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.12.RELEASEversion>
parent>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.17version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
App.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
@Configuration :声明一个类作为配置类,代替 xml 文件
**@Bean ** : 声明在方法上,将方法的返回值加入 Bean 容器,代替
标签
@Value :属性注入,替代 xml 中的属性注入
格式: @Value(“${属性}”)
@PropertySource :加载指定的属性文件(*.properties)到 Spring 的 Environment 中
可以配合 @Value 和 @ConfigurationProperties 使用
@PropertySource 和 @Value 组合使用:
可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
@PropertySource 和 @ConfigurationProperties 组合使用:
可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。
@ConfigurationProperties:用于自动配置绑定 yml 配置文件的属性和 java 对象的属性
支持属性:
用法1:标注在类上,转换配置文件配置项为bean对象
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "app.mycar")
public class Car {
private int price;
private String brand;
}
@Configuration
@EnableConfigurationProperties(Car.class)
public class Config {
}
用法2:标注在配置类的方法上,搭配 @bean 使用,绑定第三方属性
@Configuration
public class DbConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource datasource(){
return new DruidDataSource();
}
}
Spring中的Environment用来表示整个应用运行时的环境,可以使用Environment类获取整个运行环境中的配置信息。
方法:
public String getProperty(String key)
public <T> T getProperty(String key, Class<T> targetType)
// 注:key为配置文件中的key
示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
@Configuration // 声明这个类是一个配置类
@PropertySource(value = "classpath:user.properties") //加载配置文件
public class UserConfig {
@Autowired
private Environment environment;
@Bean //创建User对象,交给spring容器 User对象中的值从配置文件中获取
public User getUser() {
User user = new User();
user.setUsername(environment.getProperty("user.username"));
user.setPassword(environment.getProperty("user.password"));
return user;
}
}
配置文件被加载的优先级是:
properties > yml > yaml
若相同的配置在多种配置文件类型中都配置了,则优先级高的配置生效
Spring Boot 封装了大量的默认配置:
Spring boot 各版本文档目录:https://docs.spring.io/spring-boot/docs/
SpringBoot 2.3.0.RELEASE版本的默认配置列表(其他版本类似):
https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/reference/html/appendix-application-properties.html
Spring Boot 常用基础配置:
server:
# 服务端口号,默认8080
port: 8080
logging:
level:
# 微服务的日志配置。格式:包路径: 日志级别
com.test: debug
spring:
application:
name: test-service
datasource: # 数据源配置
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/leyou?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
设置web访问端口
server:
port: 8080
日志级别分为 FATAL、ERROR、WARN、INFO、DEBUG、ALL 或者自定义的级别。
Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG
企业生产环境,一般设置为 INFO 级别,表示打印 INFO 及以上级别的日志,不打印 DEBUG 及以下级别的日志
开发和测试环境,一般设置为 DEBUG 级别,表示所有的级别的日志都能输出
日志级别控制:
logging:
level:
com.test: debug
org.springframework.web: debug
说明:
默认的静态资源路径为:
只要静态资源放在这些目录中任何一个,SpringMVC都会处理。
一般把静态资源放在classpath:/static/
目录下。
如果想要保持 Spring Boot 的一些默认 MVC 特征,同时又想自定义一些 MVC 配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等),可以让一个类实现 WebMvcConfigurer
接口,并且添加 @Configuration
注解,但不能添加@EnableWebMvc
注解
如果想要自定义 HandlerMapping
、HandlerAdapter
、ExceptionResolver
等组件,可以创建一个 WebMvcRegistrationsAdapter
实例来提供以上组件
如果想要完全自定义 Spring MVC,不保留 Spring Boot 提供的一切特征,可以自己定义类并且添加 @Configuration
注解和 @EnableWebMvc
注解
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.debug("preHandle方法执行...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.debug("postHandle方法执行...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.debug("afterCompletion方法执行...");
}
}
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
/**
* 注册自定义拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 通过registry来注册拦截器,通过addPathPatterns来添加拦截路径
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/user/**")
.excludePathPatterns("/user/login"); // 这个地址的不拦截
}
}
方法:
只定义了一个 run(ApplicationArguments args) 方法
run 方法的参数 ApplicationArguments 可以获取到当前项目执行的命令参数(比如把这个项目打成 jar 执行的时候,带的参数可以通过 ApplicationArguments 获取到)。
由于该方法是在容器启动完成之后,才执行的,所以,这里也可以从 spring 容器中拿到其他已经注入的 bean。
使用场景:
springBoot 项目启动时,若想在启动之后直接执行某一段代码,就可以自定义一个类实现 ApplicationRunner 这个接口,并重写接口的 run 方法。
@Component // 此类必须要交给spring管理才生效
public class ConsumerRunner implements Application{
@Oberride
public void run(ApplicationArgumers args) throws Exception{
//代码
System.out.println("需要在springBoot项目启动时执行的代码---");
}
}
在同一个项目中,可以定义多个 ApplicationRunner 的实现类。
如果有多个实现类,同时又需要它们按一定顺序执行,可以通过在实现类上加上 @Order 注解或者实现 Ordered 接口来实现。
SpringBoot 会按照 @Order 中的 value 值从小到大依次执行。即值越小拥有越高的优先级,值越小越先被加载。
注:值可为负数。
Spring Boot 内部集成了大量第三方服务,提供了默认配置,而默认配置生效的步骤:
Spring Boot 能够快速开发的原因就在于内置了很多第三方组件的默认配置,使用的步骤如下:
使用启动器
如果不想自己配置,只需要引入启动器依赖即可,而依赖版本也不用操心,因为只要引入了 Spring Boot 提供的 stater(启动器),就会自动管理依赖及版本了。
替换默认配置
SpringBoot 的配置,都会有默认属性,而这些属性可以通过修改 application.properties 文件来进行覆盖。
@Condition 是在 Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作
@Conditional 标注在配置类上或配置类的方法上,和 @Configuration 配合使用,@Conditional 指定的条件成立,配置类里面的内容才生效
SpringBoot常用条件注解:
示例:
User类
@Data
public class User {
private String username;
private Integer age;
}
配置类
@Configuration
@ConditionalOnProperty(value = "user.enable") // 配置文件存在该配置项时该配置类才生效
public class UserConfig {
@Bean
public User user(){
User user = new User();
user.setUsername("tom");
user.setAge(18);
return user;
}
}
配置文件中添加如下配置:
user:
enable: true
添加测试用例
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTests {
@Autowired
private User user;
@Test
public void testUser(){
System.out.println(user);
}
}
SpringBoot自动配置流程图
使用的时候只需要引入相应的starter,starter是一个指示信号,引入这个依赖之后,相应的条件满足了,就会注册相应的Bean。
参考:
@Import 注解:把类导入 Spring IOC容器
有多种方式能让类加 IOC容器管理,如@Bean、@Component等,@Import 是另外一种方式,更加快捷。
支持三种方式:
主要用法:
直接填 class 数组方式
@Configuration
@Import({User.class}) // 大括号中可以添加多个类,使用逗号分隔,例如 {User.class,UserInfo.class}
public class UserConfig {}
ImportSelector 方式(Spring Boot 底层采用比较得多的方式)
// 自定义ImportSelector
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// 返回的是需要加载的类名数组 注意这里需要的是类的全路径
return new String[]{"com.itheima.redis.entity.User"};
}
}
@Configuration
@Import(MyImportSelector.class)
public class UserConfig {}
ImportBeanDefinitionRegistrar 方式
这种方式和 ImportSelector 方式类似,不过这种方式可以自定义Bean在容器中的名称
// 自定义ImportBeanDefinitionRegistrar
public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestD.class);
//自定义注册bean
registry.registerBeanDefinition("testD1111",rootBeanDefinition);
}
}
@Import({TestImportBeanDefinitionRegistrar.class})
@Configuration
public class ImportConfig {}
流程图
查看源码
重点的注解有3个:
源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
这个注解上面有一个 @Configuration 注解,@Configuration 注解的作用为声明当前类是一个配置类,然后 Spring 会自动扫描到添加了@Configuration的类,并且读取其中的配置信息。
@SpringBootConfiguration 是来声明当前类是 SpringBoot 应用的配置类 。
源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
借助@Import(AutoConfigurationImportSelector.class)
,@EnableAutoConfiguration
可以帮助 Spring Boot 应用将所有符合条件的 @Configuration
配置都加载到当前 Spring Boot 创建并使用的IOC容器。
AutoConfigurationImportSelector
源码,查看selectImports
方法:
继续跟进 getAutoConfigurationEntry 方法
在getCandidateConfigurations
方法中有一段提示:
跟进loadFactoryNames
方法:
可以看到从这个位置加载配置:
找到配置文件
这里有自动配置:
在自动配置包中内置了大量的第三方中间件的配置类:
总结:@EnableAutoConfiguration
从 classpath 中搜寻所有 META-INF/spring.factories
配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration
对应的配置项通过反射实例化为对应的标注了 @Configuration 的 JavaConfig 形式的 IOC 容器配置类,然后汇总为一个,并加载到IOC容器。
开启组件扫描。提供了类似与
标签的作用
通过 basePackageClasses 或者 basePackages 属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包
而@SpringBootApplication注解声明的类就是 main 函数所在的启动类,因此扫描的包是该类所在包及其子包。因此,一般启动类会放在一个比较前的包目录中
SpringBoot 自带监控功能 Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、配置属性、日志信息等;同时也可以通过Actuator管理应用程序,例如通过Actuator去做一个shutdown功能(默认是不开启的),另外还可以在运行的过程中对日志进行调整。
Endpoints:端点
可以把 Endpoints 理解为一个功能模块,功能模块可以监控 Spring Boot 应用,甚至可以与 Spring Boot 进行交互(比如读取信息,关闭应用等操作)。Spring Boot内置了很多 Endpoints,最重要的 Endpoints 是 health,即健康检查模块。
Actuator端点说明
端点 | 说明 | 默认开启 | 默认 HTTP | 默认 JMX |
---|---|---|---|---|
auditevents | 公开当前应用程序的审查事件信息 | Y | N | Y |
beans | 显示Spring loC容器关于Bean的信息 | Y | N | Y |
caches | 显示应用中的缓存 | Y | N | Y |
conditions | 显示自动配置类的评估和配置条件,并且显示他们匹配或者不匹配的原因 | Y | N | Y |
configprops | 显示当前项目的属性配置信息(通过@ConfigurationProperties配置) | Y | N | Y |
env | 显示当前Spring应用环境配置属性(ConfigurableEnvironment) | Y | N | Y |
flyway | 显示已经应用于flyway数据库迁移的信息 | Y | N | Y |
health | 显示当前应用健康状态 | Y | Y | Y |
httptrace | 显示最新追踪信息(默认为最新100次 HTTP请求) | Y | N | Y |
info | 显示当前应用信息 | Y | Y | Y |
loggers | 显示并更新应用程序中记录器的配置 | Y | N | Y |
liquibase | 显示已经应用于liquibase数据库迁移的信息 | Y | N | Y |
metrics | 显示当前配置的各项“度量”指标 | Y | N | Y |
mappings | 显示由@RequestMapping (@GetMapping和@PostMapping 等)配置的映射路径信息 | Y | N | Y |
scheduledtasks | 显示当前应用的调度任务计划 | Y | N | Y |
sessions | 允许从Spring会话支持的会话存储库检索和删除用户会话,只是Spring 会话对响应式Web 应用还暂时不能支持 | Y | N | Y |
shutdown | 允许当前应用被优雅地进行关闭(在默认的情况下不启用这个端点) | N | N | Y |
threaddump | 显示线程泵 | Y | N | Y |
heapdump | 返回 Heap Dump 文件,格式为 HPROF | Y | N | N/A |
prometheus | 返回可供 Prometheus 抓取的信息 | Y | N | N/A |
注意:
依赖坐标
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
如果想看更多的信息,在配置文件中配置:
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: "*"
Actuator监控接口:
http://localhost:8080/actuator/beans
http://localhost:8080/actuator/env
http://localhost:8080/actuator/mappings
具体详细的解释:
路径 | 描述 |
---|---|
/beans | 描述应用程序上下文里全部的Bean,以及它们的关系 |
/env | 获取全部环境属性 |
/env/{name} | 根据名称获取特定的环境属性值 |
/health | 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供 |
/info | 获取应用程序的定制信息,这些信息由info打头的属性提供 |
/mappings | 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系 |
/metrics | 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 |
/metrics/{name} | 报告指定名称的应用程序度量值 |
/trace | 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等) |
management:
server:
# Actuator的管理端口号,默认跟服务端口号(server.port)一致
port: 8085
endpoint:
health:
# 是否开启health端点,默认为true
enabled: true
# 展示健康检查中所有指标的详细信息
show-details: always
endpoints:
# web:http方式
web:
exposure:
# 暴露可以通过web访问的端点。默认"health,info",用 * 可以包含全部端点
include: "*"
# 不暴露的端点
exclude:
# 自定义监控路径前缀。默认 /actuator
base-path: /actuator
# 修改端点的访问路径(映射),例如将 /beans 更改为 /request_beans
path-mapping:
beans: request_beans
# 所有端点是否默认启动,默认true。若设置为false,则默认情况下所有端点都不启用,此时需要按需启用端点
enabled-by-default: true
Actuator 的监控内容够详细,但是阅读性比较差,所以可以使用 Spring Boot Admin 提供一个可视化的界面查阅信息,Spring Boot Admin 是一个第三方提供的开源社区项目,用于管理和监控 SpringBoot 应用程序。
源码库:https://github.com/codecentric/spring-boot-admin
Spring Boot Admin 有两个角色,客户端(Client)和服务端(Server):
应用程序作为 Spring Boot Admin Client 向为 Spring Boot Admin Server 注册
Spring Boot Admin Server 的界面将展示 Spring Boot Admin Client 的监控信息
开发步骤如下:
admin-server:
创建 admin-server 模块
导入依赖坐标 admin-starter-server
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-starter-serverartifactId>
<version>2.3.0version>
dependency>
在启动类上标注 @EnableAdminServer 注解,启用 Admin 监控功能
配置相关信息
server:
port: 8888
启动 server 服务,访问:http://localhost:8888/#/applications
admin-client: 自己创建的项目就是所谓的client端
创建 admin-client 模块
导入依赖坐标 admin-starter-client
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-starter-clientartifactId>
<version>2.3.0version>
dependency>
配置相关信息:server地址等
spring:
boot:
admin:
client:
url: http://localhost:8888
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: "*"
启动 client 服务
参考:https://www.jianshu.com/p/b0528b52772c
spring:
boot:
admin:
# server端的访问路径。默认为 /
context-path: /
monitor:
# 更新client端状态的时间间隔,默认为10000,单位是毫秒
period: 10000
# client端状态的生命周期,该生命周期内不会更新client状态,默认为100000,单位是毫秒
status-lifetime: 100000
# 查询client状态信息时的连接超时时间,默认为2000,单位是毫秒
# 如果2秒内没有获取到client的状态信息,则认为连接已经断开
connect-timeout: 2000
# 查询client状态信息时的读取超时时间,默认为2000,单位是毫秒(如果2秒内没有获取到client的状态信息,则认为读取失败)
read-timeout: 2000
# 要被过滤掉的元数据(当与正则表达式相匹配时,这些数据会在输出的json数据中过滤掉)
# 默认值是".password", ".secret",".∗secret", ".key", ".",".token", ".credentials.", ".*vcap_services", ".credentials.", ".∗vcap services"
metadata-keys-to-sanitize:
# 要获取的client的端点信息
# 默认是 "health", "env", "metrics", "httptrace:trace", "threaddump:dump", "jolokia", "info", "logfile", "refresh", "flyway", "liquibase", "heapdump", "loggers", "auditevents"
probed-endpoints:
instance-proxy:
# 向client发起请求时不会被转发的headers信息。默认值是"Cookie", "Set-Cookie", "Authorization"
ignored-headers:
ui:
# 在导航栏中显示的brand值
brand:
# 显示的页面标题。默认是"Spring Boot Admin"
title:
参考:https://www.jianshu.com/p/b0528b52772c
spring:
boot:
admin:
client:
# 是否启用spring boot Admin客户端,默认为true
enabled: true
# 要注册的Admin Server端的url地址。如果要同时在多个server端口注册,则用逗号分隔各个server端的url地址
url: http://localhost:8888
# server端获取client信息的路径,默认情况下server通过访问/instances请求来获取到client端的信息。(client端向server端注册,注册成功后server端会给该client创建一个唯一的clientID值。当server端需要获取client的信息,比如health信息时,server端会发送http://IP:PORT/instances/clientID/actuator/health即可,这里的http://IP:PORT是client所在服务器的IP地址,instances就是该属性的值)
api-path: instances
# 如果server端需要进行认证时,该属性用于配置用户名
username: user
# 如果server端需要进行认证时,该属性用于配置密码
password: 123456
# 注册时间间隔,默认10000,单位是毫秒(client通过持续不断地向server端进行注册来保持client端与server端的连接)
period: 10000
# 注册连接超时时间,默认5000,单位是毫秒。当client向server进行注册时,如果5秒钟没有注册完成则认为本次注册失败
connect-timeout: 5000
# 注册读取超时,默认5000,单位是毫秒
read-timeout: 5000
# 是否开启自动注册,默认为true
auto-registration: true
# 是否开启自动注销,如果服务端运行在云平台,默认值是true
auto-deregistration: null
# 默认为true,client只会在一个server端进行注册(按照spring.boot.admin.client.url中设置的server的顺序),如果该server端宕机,会自动在下一个server端进行注册。如果该属性值为false,则会在所有的server端进行注册
egister-once: true
instance:
# 注册的management-url,如果可用的url不同的话,可以重写该值。
# 默认该属性值与management-base-url 和 management.context-path两个属性值有关
management-url:
# 用于计算management-url的基本URL。该路径值在运行时进行获取并赋值给 base url
# 默认该属性值与management.port, service-url 以及server.servlet-path有关
management-base-url:
# 用于计算service-url的基本URL。该路径值在运行时进行获取并赋值给 base url
service-base-url:
# 注册的health-url地址,如果可用的url不同可以重写该值
health-url:
# 注册的service-url值
service-url: http://192.168.0.66:22586
# 客户端工程的名字。默认值是配置的spring.application.name的值
name:
# 是否使用注册的ip地址来取代上述各个url中hostname的值,默认为false
prefer-ip: true
启动器一般都是以spring-boot-starter-
开头,这种方式一般都是Spring 官方的命名方式。
其他企业开发的启动器命名方式类似于:XXX-boot-starter
启动器一般都是一个空壳子,里面没有代码,主要用于管理依赖
开发步骤:
创建 starter 项目,示例:test-hello-spring-boot-starter
创建自动配置项目,示例:test-spring-boot-autoconfigure
(1)添加基本的springboot依赖(因为要用@Bean等注解)
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.3.RELEASEversion>
<relativePath/>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
dependencies>
(2)定义自动配置类,示例:在配置类中将HelloTemplate定义为一个Bean
@Configuration
public class HelloAutoConfiguration {
@Bean //实例化HelloTemplate,交给Spring IOC 容器管理
public HelloTemplate helloTemplate(){
return new HelloTemplate();
}
}
(3)在resources下创建META-INF目录,在META-INF目录下创建 spring.factories 文件,在 spring.factories 中编辑要扫描的配置类(HelloAutoConfiguration),这样spring就会扫描到 HelloAutoConfiguration 了
# 第一行固定写法,第二行这个是我们写的配置类的类名全路径 这样spring就能扫描到了
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.itheima.hellospringbootdemo.util.HelloAutoConfiguration
在 starter 项目的 pom 文件中添加自动配置项目的依赖
<dependencies>
<dependency>
<groupId>com.testgroupId>
<artifactId>test-spring-boot-autoconfigureartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
dependencies>
在其它工程中添加 stater 项目的依赖,即可通过 @Autowired 使用自动配置项目中注入到Spring容器的 Bean
在SpringBoot项目中,都是通过将项目打成 jar 包,然后直接运行(因为内置了tomcat)
准备一个开发完的 SpringBoot 项目,因为是 SpringBoot 项目,所以一定要有启动类
在准备打包的项目中的 pom 文件中,添加如下内容
<build>
<finalName>demofinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
找到 idea 右侧的 maven 区域,找到想打包的项目,点击clean,清除缓存,如图
如果点击test,会将在 test/java 下所有的测试用例都跑一边,所有测试用例都通过后才会执行后面的流程,这里的流程都是下一步会包含上一步。
如果在打包时不想运行测试用例,有两种方式跳过:
点击 package 进行打包操作,最后显示 BUILD SUCCESS
即为打包成功
注意:如果项目有自定义的依赖,则需要先点击 install,将依赖包安装到本地仓库;否则若直接点击package,会报找不到类等错误
在 idea 左侧项目的 target 目录下,可以找到刚打好的 jar 包
在 jar 包文件夹地址栏上输入cmd,打开命令窗口,在命令行中输入java -jar 项目名.jar
,回车即可启动应用
一般在一个项目中,总是会有好多个环境。比如:开发环境 -> 测试环境 -> 预发布环境 -> 生产环境。
每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一点不同。
在 Spring Boot中,多环境配置的文件名需要满足 application-{profile}.yml 或者 application-{profile}.properties的格式,其中{profile} 对应环境,比如:
配置环境的常用方式:
方式1:直接在 application.yml
中配置:
spring:
profiles:
active: dev
方式2:在 IDEA 中指定配置生效:
方式3:在启动时添加参数来指定使用哪个配置
# 使用测试环境配置文件
java -jar xxx.jar --spring.profiles.active=test
Spring Boot 若在优先级更高的位置找到了相同的配置,那么它就会无视低级的配置。如果不同的配置是可以同时生效的。
根据 Spring Boot 的文档,配置使用的优先级从高到低的顺序,具体如下所示:
方式1:通过环境变量 spring.config.location 指定
注意:使用 location 参数指定配置文件后,会使项目默认配置文件(application.properties 或 application.yml )失效,Spring Boot 将只加载指定的外部配置文件
java -jar springbootdemo-0.0.1-SNAPSHOT.jar --spring.config.location=./my-application.yml
方式2:通过环境变量 spring.config.additional-location 指定
注意:使用 additional-location 参数不会使项目默认的配置文件失效,外部配置文件会与项目默认的配置文件共同生效,形成互补配置,且其优先级比所有默认配置文件的优先级都高
java -jar springbootdemo-0.0.1-SNAPSHOT.jar --spring.config.additional-location=./my-application.yml