【SpringBoot】一:SpringBoot的基础(下)

news2024/12/23 17:57:17

文章目录

  • 1.外部化的配置
    • 1.1 配置文件基础
      • 1.1.1 配置文件格式
      • 1.1.2 application文件
      • 1.1.3 application.properties
      • 1.1.4 application.yml
      • 1.1.5 environment
      • 1.1.6 组织多文件
      • 1.1.7多环境配置
    • 1.2 绑定Bean
      • 1.2.1 简单的属性绑定
      • 1.2.2 嵌套Bean
      • 1.2.3 扫描注解
      • 1.2.4 处理第三方库对象
      • 1.2.5 集合 Map,List 以及 Array
      • 1.2.6 指定数据源文件
  • 2.创建对象的三种方式

1.外部化的配置

项目中经常使用 properties 与 yaml 文件,其次是命令行参。

1.1 配置文件基础

1.1.1 配置文件格式

properties

语法:key=value。key 是唯一的,文件扩展名为 properties

yaml

语法:key:[空格] 值

1.1.2 application文件

Spring Boot 同时支持 properties 和 yml 格式的配置文件。 配置文件名称默认是 application。我们可以使用application.properties , application.yml

1.1.3 application.properties

在application.properties中写入我们自己的配置文件

【application.properties】

在这里插入图片描述

【SomeService.java】

package com.sdnu.config.pk1;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.StringJoiner;

@Service
public class SomeService {
    // 使用@Value("${key: 默认值}")
    @Value("${app.name}")
    private String name;
    @Value("${app.owner}")
    private String owner;
    @Value("${app.port:8008}")
    private Integer port;

    public void printValue(){
        StringJoiner joiner = new StringJoiner(";");
        String s = joiner.add(name).add(owner).add(String.valueOf(port)).toString();
        System.out.println("result=" + s);
    }
}

【测试类】

package com.sdnu.config;

import com.sdnu.config.pk1.SomeService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Lession07ConfigApplicationTests {
    @Autowired
    private SomeService someService;
    @Test
    void test01(){
        someService.printValue();
    }
    @Test
    void contextLoads() {
    }
}

测试结果:
在这里插入图片描述

1.1.4 application.yml

使用yml

# 编写配置文件 key: 值

app:
  name: Lession07
  owner: root
  port: 8002

还是原来的测试程序:
在这里插入图片描述

1.1.5 environment

Environment 是外部化的抽象,是多种数据来源的集合。从中可以读取 application 配置文件,环境变量,系统属性。使用方式在 Bean 中注入 Environment。调用它的 getProperty(key)方法。

package com.sdnu.config.pk2;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;

@Service
public class ReadConfig {
    @Autowired
    public Environment environment;
    public void printValue(){
        //通过key获取某个value
        String name = environment.getProperty("app.name");
        System.out.println(name);
        // 还可以判断某个key是否存在
        if(environment.containsProperty("app.owner")){
            System.out.println("app.owner存在");
            System.out.println(environment.getProperty("app.owner"));
        }
        if(environment.containsProperty("app.port")){
            System.out.println("app.port存在");
            System.out.println(environment.getProperty("app.port", Integer.class, 8999));
        }
    }
}

1.1.6 组织多文件

在这里插入图片描述

【MultiConfigService.java】

package com.sdnu.config.pk3;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class MultiConfigService {
    @Value("${spring.redis.host}")
    private String redisHostName;
    @Value("${spring.datasource.url}")
    private String jdbcUrl;

    public void printValue(){
        System.out.println("host:" + redisHostName);
        System.out.println("url:" + jdbcUrl);
    }
}

测试结果:
在这里插入图片描述

1.1.7多环境配置

在这里插入图片描述

【application-dev.yml】

myapp:
  memo: 这是开发环境配置文件dev

# 指定环境名称
spring:
  config:
    activate:
      on-profile: dev

【application-test.yml】

myapp:
  memo: 这是开发环境配置文件test

# 指定环境名称
spring:
  config:
    activate:
      on-profile: test

在Application.yml中激活test
【Application.yml】

# 编写配置文件 key: 值

app:
  name: Lession07
  owner: root
  port: 8002

# 导入其它配置文件,多个文件之间使用逗号隔开
spring:
  config:
    import: conf/db.yml, conf/redis.yml

  # 激活某个配置文件,(环境)
  profiles:
    active: test

【MultiEnvService.java】

package com.sdnu.config.pk4;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class MultiEnvService {
    @Value("${myapp.memo}")
    private String memo;
    public void printMemo(){
        System.out.println("memo:::" + memo);
    }
}

【测试】

    @Autowired
    private MultiEnvService multiEnvService;
    @Test
    void test04(){
        multiEnvService.printMemo();
    }

在这里插入图片描述

1.2 绑定Bean

1.2.1 简单的属性绑定

【AppBean.java】

package com.sdnu.config.pk5;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @ConfigurationProperties 表示使用Bean对象读取配置项
 * prefix 表示配置文件中的多个key的公共开始部分
 */
@Component
@ConfigurationProperties(prefix = "app")
public class AppBean {
    // key的名称和属性名相同,调用属性setXXXX方法给属性赋值
    private String name;
    private String owner;
    private String port;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    @Override
    public String toString() {
        return "AppBean{" +
                "name='" + name + '\'' +
                ", owner='" + owner + '\'' +
                ", port='" + port + '\'' +
                '}';
    }
}

【application.yml】

# 编写配置文件 key: 值

app:
  name: Lession07
  owner: root
  port: 8002

# 导入其它配置文件,多个文件之间使用逗号隔开
spring:
  config:
    import: conf/db.yml, conf/redis.yml

  # 激活某个配置文件,(环境)
  profiles:
    active: test

【测试】

    @Autowired
    private AppBean appBean;
    @Test
    void test05(){
        System.out.println(appBean.toString());
    }

补充:
默认返回代理Bean对象。
在这里插入图片描述
设置@Configuration(proxyBeanMethods = false)后返回普通Bean对象。
在这里插入图片描述

1.2.2 嵌套Bean

【application.yml】
在这里插入图片描述
【NestAppBean.java】
在这里插入图片描述
【Security.java】
在这里插入图片描述

1.2.3 扫描注解

@ConfigurationProperties 注解起作用,还需要@EnableConfigurationProperties 或@ConfigurationPropertiesScan。这
个注解是专门寻找@ConfigurationProperties 注解的,将他的对象注入到 。

【SpringBoot配置类】

package com.sdnu.config;

import com.sdnu.config.pk6.NestAppBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

//启动ConfigurationProperties
//@EnableConfigurationProperties({NestAppBean.class})

//扫描注解的包,绑定Bean注入到Spring容器
@ConfigurationPropertiesScan(basePackages = {"com.sdnu.config.pk6"})
@SpringBootApplication
public class Lession07ConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(Lession07ConfigApplication.class, args);
    }

}

1.2.4 处理第三方库对象

【application.yml添加新的配置】

security:
  username: root77
  password: 888888

【创建配置类】

package com.sdnu.config.pk7;

import com.sdnu.config.pk6.Security;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyApplicationConfig {
    //创建Bean对象,属性来自配置文件
    @ConfigurationProperties(prefix = "security")
    @Bean
    public Security createSecurity(){
        return new Security();
    }
}

【 单元测试】

    @Autowired
    private Security security;

    @Test
    void test07(){
        System.out.println("security = " + security);
    }

1.2.5 集合 Map,List 以及 Array

(1)创建保存数据的Bean
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(2)配置数据【application.yml】

# 数组和List一样,一个"-" 表示一个成员
names:
  - lisi
  - zhangsan

# List<Myserver> servers
servers:
  - title: 北京服务器
    ip: 192.168.0.0.1
  - title: 上海服务器
    ip: 192.168.0.0.2

# Map<String, User> users
users:
  user1:
    name: 张三
    sex:age: 22
  user2:
    name: 李四
    sex:age: 21

(3) 启动类,增加扫描包
在这里插入图片描述
【测试】


    @Autowired
    private CollectionConfig collectionConfig;

    @Test
    void test08(){
        System.out.println("collectionConfig = " + collectionConfig.toString());
    }

在这里插入图片描述

1.2.6 指定数据源文件

在这里插入图片描述

【group-info.properties】

group.name=IT学习专栏
group.leader=root
group.members=20

【group.java】
在这里插入图片描述
【测试】

    @Autowired
    private Group group;
    @Test
    void test09(){
        System.out.println("group = " + group);
    }

在这里插入图片描述

2.创建对象的三种方式

 传统的 XML 配置文件
 Java Config 技术, @Configuration 与@Bean
 创建对象的注解,@Controller ,@Service , @Repository ,@Compon

Spring Boot 不建议使用 xml 文件的方式, 自动配置已经解决了大部分 xml 中的工作了。如果需要 xml 提供 bean的声明,@ImportResource 加载 xml 注册 Bean

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/446907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【移动端网页布局】移动端网页布局基础概念 ② ( 视口 | 布局视口 | 视觉视口 | 理想视口 )

文章目录 一、视口1、布局视口 ( 网页大小 | 网页大小 > 设备大小 )2、视觉视口 ( 设备大小 | 网页大小 > 设备大小 )3、理想视口 ( 网页大小 设备大小 ) 一、视口 浏览器 显示 网页页面内容 的 屏幕区域 被称为 " 视口 " ; 视口分为以下几个大类 : 布局视口…

项目协同中的git

在远程代码仓库&#xff08;云效&#xff0c;gitee&#xff0c;github&#xff0c;Coding等&#xff09;新建一个代码库&#xff0c; 我使用的云效 新建一个develop分支&#xff0c;后续所有人的提交代码都合并到develop分支上面&#xff0c;一般develop分支是用来开发用的&…

尚融宝22-提交借款申请

目录 一、需求介绍 二、图片上传 &#xff08;一&#xff09;前端页面 &#xff08;二&#xff09;实现图片上传 三、数据字典展示 &#xff08;一&#xff09;后端 &#xff08;二&#xff09;前端 四、表单信息提交 &#xff08;一&#xff09;后端 1、VO对象&…

嵌入式工程师如何快速的阅读datasheet的方法

目录 ▎从项目角度来看datasheet ▎各取所需 ▎最后 Datasheet&#xff08;数据手册&#xff09;的快速阅读能力&#xff0c;是每个工程师都应该具备的基本素养。 无论是项目开始阶段的选型还是后续的软硬件设计&#xff0c;到后期的项目调试&#xff0c;经常有工程师对着英…

06-Node.js—模块化

目录 1、介绍1.1 什么是模块化与模块 ?1.2 什么是模块化项目 ?1.3 模块化好处 2、模块暴露数据2.1 模块初体验2.2 暴露数据2.2.1 module.exports value2.2.2 exports.name value 3、导入&#xff08;引入&#xff09;模块4、导入模块的基本流程5、CommonJS 规范参考 1、介绍…

使用RabbitMQ的手动接收模式:消息第二次入队Failed to declare queue

问题&#xff1a;在rabbitMQ测试使用手动接收模式时发生 Failed to declare queue错误 : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code406, reply-textPRECONDITION_FAILED - unknown delivery tag 1, class-id60, method-id80…

C++ 命名空间、域、缺省参数、函数重载、引用、auto、内联函数的知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

绪论 从本章开始我们正式进入到C的内容&#xff0c;对此如果没有学习过C语言的建议先将C语言系统的学习一遍后再来&#xff08;已经更新完在专栏就能看到&#xff09;。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 附&#xff1a;红色&#…

Linux运维基础

一.vim编辑器 1.编辑器介绍 vi/vim是visual interface的简称,是Linux中最经典的文本编辑器&#xff0c;同图形化界面中的文本编辑器一样&#xff0c;vi是命令行下对文本文件进行编辑的绝佳选择&#xff0c;粗暴理解相当于windows下的记事本。 vim是vi的加强版本,兼容vi的所有…

java版UWB人员定位系统源码,提供位置实时显示、历史轨迹回放、电子围栏、行为分析、智能巡检等功能

运用UWB定位技术开发的人员定位系统源码 文末获取联系&#xff01; 本套系统运用UWB定位技术&#xff0c;开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有效计算复杂环境下的人员与物品的活动信息。 提供位置实时显…

SLAM论文速递【SLAM—— DynaSLAM:动态场景中的跟踪、建图和修复—4.19(1)

论文信息 题目&#xff1a; DynaSLAM:Tracking,Mapping and Inpainting in Dynamic Scenes DynaSLAM:动态场景中的跟踪、映射和修复论文地址&#xff1a; https://arxiv.org/pdf/1806.05620.pdf发表期刊&#xff1a; IEEE Robotics and Automation Letters ( Volume: 3, Issu…

RPC一文精通

基础&#xff1a; http是基于应用层协议&#xff0c;对请求和响应进行规范包装,一次http请求就会进行一次tcp连接和断开连接&#xff0c;属于短链接 udp是异步响应&#xff0c;无需建立连接&#xff0c;就可以发送封装的IP数据包 tcp是基于传输层协议&#xff0c;并规范了三…

Python单向循环链表操作

目录 一、单向循环链表 单向循环链表图 二、单向循环链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&a…

JavaSE 和 Java EE 分别是什么

Java 作为最流行的编程语言受到了许多人的喜爱&#xff0c;其在编程中的地位自不必多说。 对于许多才刚刚入门 Java 的朋友来讲&#xff0c;常常会产生这样的困惑&#xff0c;JavaEE是什么&#xff1f;JavaSE又是什么&#xff1f; Java SE Java SE 是 Java Platform, Standa…

Liunx下进程间通信

文章目录 前言1.进程间通信相关介绍2.管道1.匿名管道2.管道的原理3.通过代码来演示匿名管道4.命名管道5.命名管道的原理6.命名管道代码演示 3.System V共享内存1.共享内存原理2.相关系统接口的介绍与共享内存的代码演示3.共享内存的一些特性 4.system V消息队列与system V信号量…

依赖注入方式

Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法)构造方法 依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程&#xff0c;如果bean运行需要的是数字或 字符串呢? 引用类型简单类型(基本数据类型与String) Spring就…

Primo Ramdisk内存盘工具软件

简介 Primo Ramdisk 软件的主要功能是通过独特的软件算法将物理内存模拟成一个超快速的硬盘&#xff0c;在这个虚拟硬盘上的读写操作均在内存中完成。由于物理内存的访问速度远远超过物理硬盘&#xff0c;因此虚拟硬盘具有非常高的数据读写速度&#xff0c;从而突破系统IO瓶颈&…

“SCSA-T学习导图+”系列:下一代防火墙

本期引言&#xff1a; 近年来&#xff0c;随着数字化业务带给我们高效和便捷的同时&#xff0c;信息暴露面的增加、网络边界的模糊化以及黑客攻击的产业化&#xff0c;使得网络安全事件相较以往成指数级增加。传统防火墙基于五元组的方式对进出网络的数据流量进行访问控制&…

医院影像图像科室工作站PACS系统 DICOM 三维图像后处理与重建

PACS报告系统的主要任务是通过运用不断积累诊断常用语&#xff0c;减轻出报告的劳动强度&#xff0c;并且将报告保存成电子文档以便日后查阅。在PACS的报告系统中&#xff0c;有三种不同层次的方法输入文字—“高级模板”、“分类词条”和“短语词典”。这三种方法的内容都可以…

记一次从JS到内网的横向案例

前言 前段时间参加了一场攻防演练&#xff0c;使用常规漏洞尝试未果后&#xff0c;想到不少师傅分享过从JS中寻找突破的文章&#xff0c;于是硬着头皮刚起了JS&#xff0c;最终打开了内网入口获取了靶标权限和个人信息。在此分享一下过程。 声明&#xff1a;本次演练中&#xf…

C/C++每日一练(20230422)

目录 1. 存在重复元素 &#x1f31f; 2. 组合总和 &#x1f31f;&#x1f31f; 3. 给表达式添加运算符 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日…