SpringBoot 基础特性
SpringBoot 基础特性
SpringApplication
相关特性
自定义 banner
- 在主配置文件写
banner.txt
的地址
#也可以不写默认路径就是 banner.txt
#从类路径下找 banner
#类路径就是 编译的target 目录 还有导入的第三方类路径。
spring.banner.location=classpath:banner.txt
#控制 banner 显示模式 这里 off 就是关闭
spring.main.banner-mode=off
自定义 SpringApplication
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
//这是 SpringApplication.run(DemoApplication.class); 分解流程。它可以在中间过程自定义一些内容
SpringApplication application = new SpringApplication(MyApplication.class);
//自定义 banner 设置 Banner.Mode
application.setBannerMode(Banner.Mode.OFF);
ConfigurableApplicationContext context = application.run(args);
}
}
FluentBuilder API方式
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//也和上面一样。也是可以自定义一些内容
new SpringApplicationBuilder(DemoApplication.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
}
}
Profiles
多环境配置
第一步:标识环境
环境:
dev(开发环境)
,test(测试环境)
,prod(生产环境)
,defalut(默认环境)
在指定的组件标注
@Profile("环境")
注解默认只有激活指定的环境, 这些组件才会生效
.
注意:
- 标注了
@Profile("defalut")
只有defalut
指定为defalut
环境才生效- 没标注
@Profile
注解那就什么环境都生效
- 在
@Controller
使用@Profile
@Profile("prod")
@Data
@Component
public class Pig {
private Long id;
private Integer age;
}
- 在
@Bean
使用@Profile
@Configuration
public class MyConfig {
@Profile("dev")
@Bean
public Cat cat() {
return new Cat();
}
}
- 在配置类上标
//test 环境才激活这个配置类
@Profile("test")
@Configuration
public class MyConfig {
@Bean
public Cat cat() {
return new Cat();
}
}
第二步:激活环境
- 配置文件方式激活
#激活指定的一个或多个环境
spring.profiles.active=dev
#指定默认环境
spring.profiles.default=default
#包含指定环境: 不管激活哪个环境, 这个都要包含进去
spring.profiles.include=dev, test
#环境分组
# haha组有 dev 和 test 设置 haha 组为激活状态
spring.profiles.group.haha=dev, test
spring.profiles.group.hehe=prod, abc
# haha组第二种写法
spring.profiles.group.haha[0]=dev
spring.profiles.group.haha[1]=test
spring.profiles.active=haha
- 命令行方式激活
java -jar xxx.jar --spring.profiles.active=dev
最佳实战
- 生效的环境:激活的环境 / 默认环境 + 包含的环境
- 项目里面这么用
- 基础的配置
mybatis
、log
、xxx
:写到包含环境中 - 需要动态切换变化的
db
、redis
:写到激活的环境中
- 基础的配置
配置文件使用 Profile 功能
application.properties
:这是主配置文件,任何情况下都生效- 其他 Profile 环境下命名规范:
application-{环境表示}.properties
只有激活各自环境配置才生效-- 比如
application-dev.properties
- 比如
- 使用:命令行或配置文件方式激活指定环境即可
- 项目的所有生效配置项 = 激活的环境配置所有项 + 主配置环境
- 如果发生配置冲突, 优先使用激活环境配置
外部化配置
SpringBoot 配置地方
SpringBoot 可以可以配置的三个地方
- IDEA 里:内部
- 项目文件夹内:外部
- 外部可以创建
config
文件夹里面放properties
config
文件夹还可以嵌套别的文件夹再放properties
- 运行的时候:命令行
- 运行
SpringBoot cmd
命令行按ctrl + c
可以继续输入 **//格式 重新运行 + 要修改的配置文件 java -jar demo1 - 0.0.1 - SNAPSHOT.jar --hello.msg=he --server.port=8081
配置优先级
- 外部优先【命令行是最外部】
- 激活优先
- 冲突就激活优先
Junit5 单元测试
核心依赖
不用我们自己导入。web场景自动会导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
使用
直接用
@Autowired
从容器中取东西利用断言机制 和 Maven 的 test 进行测试进行测试Maven 的 test 周期 会把所有测试执行一遍。信息打印在控制台
断言
@SpringBootTest
public class UnitTest {
Logger log = LoggerFactory.getLogger(Logger.class);
@Autowired
HelloService helloService;
@DisplayName("第一个测试")
@Test
void test01() {
log.info("hello");
}
@Test
void test02() {
//1. 业务规定, 返回 hello 字符串才算成功, 否则失败
String result = helloService.sayHello();
//2. 断言, 判断字符串是否等于 hello
Assertions.assertEquals("hello", result, "helloservice并没有返回hello");
}
}
可观测性
使用
- 导入依赖
- 配置文件中写配置暴露指标
- 动项目访问
/actuator
- 可以加下面路径进行监控
- 比如:
/beans
- 比如:
- 可以加下面路径进行监控
自定义 starter
场景:抽取聊天机器人场景,它可以打招呼
效果:任何项目导入此 starter 都具有打招呼功能。问候语中的人名等可以在配置文件中修改
第一步:正常写业务等待抽取改造
RobotController
@RestController
public class RobotController {
@Autowired
RobotService robotService;
@GetMapping("/robot/hello")
public String sayHello() {
String msg = robotService.sayHello();
return msg;
}
}
RobotProperties
@ConfigurationProperties(prefix = "robot")
配置绑定数据
@Component
@Data
@ConfigurationProperties(prefix = "robot")
public class RobotProperties {
private String name;
private String model;
}
Application.properties
robot.name=小谷
robot.model=chatgpt4o
RobotService
接口
public interface RobotService {
public String sayHello();
}
RobotServiceImpl
实现类
robotProperties
已经用@ConfigurationProperties(prefix = "robot")
绑定配置文件了
@Service
public class RobotServiceImpl implements RobotService {
@Autowired
RobotProperties robotProperties;
@Override
public String sayHello() {
return "我是机器人【"+ robotProperties.getName() + "】" +
"用底层大模型,【" + robotProperties.getModel() + "】,我们开始聊天吧";
}
}
第二步:抽取业务代码放公共 starter
- 把业务代码也就是
controller, Properties, Service
抽取过来。抽取过来后那边的就可以删掉了
- 抽取过来的业务需要哪些模块。
starter
就要导入哪些模块
<!--所有依赖的基础依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--lombok 依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- web 开发依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 第一种抽取:写自动配置类
RobotAutoConfiguration
只需要
@Import
就可以使用为什么:因为我们引入这个
starter
模块。默认扫描不到里面的组件。需要写一个自动配置类帮我们扫描
@EnableConfigurationProperties(RobotProperties.class)
@Configuration //把这个场景要用的所有组件导入到容器中
public class RobotAutoConfiguration {
@Bean
public RobotController robotController(){
return new RobotController();
}
@Bean
public RobotService robotService() {
return new RobotServiceImpl();
}
}
- 第二种抽取:注解
EnableRobot
只需要
@EnableRobot
就可以用
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//@Enable...是个元注解。使用 EnableRobot 注解自动使用 `@EnableConfiguration...注解
@EnableConfigurationProperties(RobotProperties.class)
public @interface EnableRobot {
}
- 第三种抽取:放到
META-INF/spring
中
只需要导入
starter
就可以使用
自动配置原理:org.springframework.boot.autoconfigure.AutoConfiguration.imports
会自动按需加载模块。我们在 resources
新建 META-INF/spirng/org.springframework.boot.autoconfigure.AutoConfiguration.imports
然后把自动配置类丢进去就行
com.atguigu.robot.starter.RobotAutoConfiguration
第三步:使用抽取的业务改造
- 导入抽取出来的
starter
<dependency>
<groupId>com.atguigu.boot</groupId>
<artifactId>robot-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 配置文件还是我们自己配
robot.name=小谷
robot.model=chatgpt4o
- 使用第一种抽取的情况
使用
@Import
注解导入
@SpringBootApplication
@Import(RobotAutoConfiguration.class)
public class Springbot02DemoApplication {
public static void main(String[] args) {
SpringApplication.run(Springbot02DemoApplication.class, args);
}
}
- 使用第二种抽取的情况
标注
@EnableRobot
注解
@SpringBootApplication
@EnableRobot
public class Springbot02DemoApplication {
public static void main(String[] args) {
SpringApplication.run(Springbot02DemoApplication.class, args);
}
}
- 使用第三种抽取的情况
直接使用
@SpringBootApplication
public class Springbot02DemoApplication {
public static void main(String[] args) {
SpringApplication.run(Springbot02DemoApplication.class, args);
}
}