当前位置: 首页 > article >正文

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

最佳实战

  • 生效的环境:激活的环境 / 默认环境 + 包含的环境
  • 项目里面这么用
    • 基础的配置mybatislogxxx:写到包含环境中
    • 需要动态切换变化的 dbredis:写到激活的环境中

配置文件使用 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);
    }

}

http://www.kler.cn/a/525694.html

相关文章:

  • 设计模式的艺术-策略模式
  • Base64详解
  • AndroidCompose Navigation导航精通2-过渡动画与路由切换
  • vue2和vue3组件之间的通信方式差异
  • Redis常用命令合集【一】
  • 穿心莲内酯(andrographolide)生物合成CYP72-文献精读106
  • 精灵图的知识
  • YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)
  • Pytorch框架从入门到精通
  • 基于springboot+vue的扶贫助农系统的设计与实现
  • SSM开发(六) SSM整合下的CURD增删改查操作(IDEA版)
  • 有效运作神经网络
  • 初阶mysql修炼手册
  • Vue.js 组合函数(Composables)
  • 算法随笔_32: 移掉k位数字
  • 供应链系统设计-供应链中台系统设计(十二)- 清结算中心设计篇(一)
  • C语言中的存储类
  • 安卓(android)音乐播放器【Android移动开发基础案例教程(第2版)黑马程序员】
  • VLLM性能调优
  • WPS怎么使用latex公式?
  • Transformer+vit原理分析
  • Linux多路转接poll
  • 解读Linux 6.x版本内核的sys目录作用
  • SQL注入漏洞之错误类型注入 爆破表 字段 列名称 以及mysql版本 以及Limit使用方式解释 以及靶场相关联系
  • 「全网最细 + 实战源码案例」设计模式——桥接模式
  • 7.抽象工厂(Abstract Factory)