文章目录
一 概述与入门
Spring缺点
- 配置繁琐
- 依赖繁琐
SpringBoot功能
- 自动配置
- 起步依赖
- 辅助功能,如内置服务器
SpringBoot提供了一种快速开发Spring项目的方式,不是对Spring功能上的增强
快速构建项目
下面通过 IDEA 来生成一个 Spring Boot 的项目
- File->New->Project->Spring Initializr
- 填写项目名称,选择路径、项目构建工具、jdk版本、打包方式,next
- 选择SpringBoot版本,添加需要的依赖,finish
二 配置
配置文件分类
-
properties
server.port=8080
-
yml/yaml
server: port: 8080
同一级目录下优先级:properties>yml>yaml
yaml
基本语法
- 数据值前面必须有空格
- 使用缩进表示层级关系
- 缩进不能使用tab键,只能使用空格,空格数量不重要,相同层级的左侧对齐即可
- #表示注释
数据格式
-
对象:键值对的集合
person: name: hhf #行内写法 person1: {name: hhf}
-
数组:一组按次序排列的值
address: - shenzhen - beijing #行内写法 address1: [shenzhen,beijing]
-
纯量:单个、不可再分的值
msg1: 'hello \n java' #单引号忽略转义字符 msg2: "hello \n java" #双引号识别转义字符
参数引用
name: java
course:
name: ${name}
读取配置文件内容
-
@Value
@Value("${name}") private String name; @Value("${person.name}") private String personName; @Value("${address[0]}") private String address1; @Value("${msg1}") private String msg1;
-
Environment
@Autowired private Environment env; //在方法中调用getProperty获取内容 env.getProperty("person.name");
-
@ConfigurationProperties
@Component //指定配置文件中的前缀 @ConfigurationProperties(prefix = "person") public class Person { //成员变量名对应配置文件属性名 private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }
@Autowired private Person person; //在方法中调用getxxx获取内容 person.getName();
<!--pom.xml加入依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
profile
动态配置切换不同环境(开发、测试、生产)
配置
-
多profile文件方式
开发环境配置:application-dev.properties
测试环境配置:application-test.properties
生产环境配置:application-pro.properties
在application.properties:
#dev为application-dev spring.profiles.active=dev
-
yml多文档方式
#通过“---”分隔不同环境的配置 --- server: port: 8081 spring: config: activate: on-profile: dev --- server: port: 8082 spring: config: activate: on-profile: test --- server: port: 8083 spring: config: activate: on-profile: pro --- #指定当前使用环境 spring: profiles: active: dev
激活
-
配置文件
输入spring.profiles.active=xxx
-
虚拟机参数
idea-edit configurations-configuration-environment-VM options,输入-Dspring.profiles.active=xxx
-
命令行参数
idea-edit configurations-configuration-environment-program arguments,输入–spring.profiles.active=xxx
没有IDE,在命令行运行:java -jar xxx.jar --spring.profiles.active=xxx
内部配置加载顺序
优先级由高到低,高优先级的会覆盖低优先级的
- 项目下config目录下
- 项目根目录
- classpath config目录下
- classpath 根目录
外部配置加载顺序
看官网https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config
三 整合其它框架
整合Junit
-
pom.xml加入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
-
src-test-java下创建测试类
-
添加@SpringBootTest(classes=启动类.class),测试类一般测试controller,service的方法,如果测试类与controller,service在同一包下可以不用指定启动类
-
编写测试方法
@SpringBootTest(classes=Springboot02Application.class)
class Springboot02ApplicationTests {
@Test
public void hello() {
System.out.println("hello");
}
}
整合Redis
- 加入依赖spring-boot-starter-data-redis
- 配置redis属性
- 注入RedisTemplate
整合Mybatis
参考https://gitee.com/SnailClimb/springboot-guide/blob/master/docs/basis/springboot-mybatis.md
四 自动配置
Condition
通过条件判断,选择性的创建Bean
自定义条件
-
定义条件类
//自定义条件类实现Condition接口,重写matches方法 public class ClassCondition implements Condition { @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { //获取注解属性值 Map<String, Object> map = annotatedTypeMetadata.getAnnotationAttributes(ConditionOnClass.class.getName()); System.out.println(map); String[] value = (String[]) map.get("value"); boolean flag=true; try { for (String className: value) { Class<?> aClass = Class.forName(className); } } catch (ClassNotFoundException e) { flag=false; e.printStackTrace(); } return flag; } }
-
自定义注解
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented //指定条件类 @Conditional(ClassCondition.class) public @interface ConditionOnClass { String[] value(); }
-
初始化Bean时,用@ConditionOnClass指定条件判断的坐标
@Configuration public class UserConfig { @Bean @ConditionOnClass(value = {"org.springframework.data.redis.core.RedisTemplate"}) public User user() { return new User(); } }
SpringBoot常用条件注解
- @ConditionOnProperty:判断配置文件是否有对应属性和值
- @ConditionOnClass:判断环境是否有对应字节码文件
- @ConditionOnMissingBean:判断环境没有对应Bean
切换内置web服务器
四种服务器:Tomcat、Jetty、Undertow、Netty
举例:将Tomcat切换成Jetty
-
查看项目依赖关系图
pom.xml-右键-diagrams-show dependencies
-
找到spring-boot-starter-tomcat,右键-exclude
-
添加spring-boot-starter-jetty依赖
@Enable*注解
用于动态启用某些功能,底层使用@Import注解导入配置类,实现Bean的动态加载
@Import注解
4种用法
-
导入Bean
@SpringBootApplication @Import(User.class) public class Springboot02Application { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Springboot02Application.class, args); Object user = run.getBean(User.class); System.out.println(user); } }
-
导入配置类
@Configuration public class UserConfig { @Bean public User user() { return new User(); } }
@SpringBootApplication @Import(UserConfig.class) public class Springboot02Application { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Springboot02Application.class, args); Object user = run.getBean(User.class); System.out.println(user); } }
-
导入ImportSelector实现类
public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"com.example.springboot02.domain.User"}; } }
@SpringBootApplication @Import(MyImportSelector.class) public class Springboot02Application { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Springboot02Application.class, args); Object user = run.getBean(User.class); System.out.println(user); } }
-
导入ImportBeanDefinitionRegistrar实现类
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition(); registry.registerBeanDefinition("user",beanDefinition); } }
@SpringBootApplication @Import(MyImportBeanDefinitionRegistrar.class) public class Springboot02Application { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Springboot02Application.class, args); Object user = run.getBean(User.class); System.out.println(user); } }
@EnableAutoConfiguration注解
内部使用@Import({AutoConfigurationImportSelector.class})
加载配置类
配置文件位置:META-INF/spring.factories,配置文件定义了大量配置类,应用启动时会自动加载配置类,初始化Bean
五 监听机制
实现以下监听器接口,重写相应方法进行监听ApplicationContextInitializer、SpringApplicationRunListener、CommandLineRunner、ApplicationRunner
六 启动流程
参考https://blog.youkuaiyun.com/mnicsm/article/details/93893669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162973060916780262569310%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162973060916780262569310&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-6-93893669.pc_search_similar&utm_term=springboot%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B&spm=1018.2226.3001.4187
七 监控
Actuator
实现对程序内部运行情况监控
-
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
配置文件加入
#开启健康检查的完整信息 management.endpoint.health.show-details=always #将所有监控暴露出来 management.endpoints.web.exposure.include=*
-
访问http://localhost:8080/actuator查看所有监控
http://localhost:8080/actuator/health查看健康情况,“status”:"UP"代表正常
http://localhost:8080/actuator/info查看配置文件info前缀的信息
Spring Boot Admin
图形化界面进行监控
服务端模块
- 加入依赖spring-boot-admin-starter-server
- 启动类加上@EnableAdminServer
客户端模块
-
加入依赖spring-boot-admin-starter-client
-
配置文件
spring.boot.admin.client.url=http://localhost:8080 management.endpoint.health.show-details=always management.endpoints.web.exposure.include=*
-
先启动server,再启动client
-
访问http://localhost:8080
IDEA在endpoints也可以查看部分监控
八 部署
jar
看https://blog.youkuaiyun.com/weixin_46818541/article/details/119459444
war
- 启动类继承SpringBootServletInitializer,重写configure方法
- pom.xml修改打包方式为war
- 打包,启动外部tomcat,访问时注意加上项目名