SpringBoot 第一课(Ⅲ) 配置类注解

目录

一、@PropertySource

二、@ImportResource

①SpringConfig (Spring框架全注解)

②@ImportResource注解实现

三、@Bean

四、多配置文件

多Profile文件的使用

文件命名约定:

激活Profile:

YAML文件支持多文档块:

五、配置加载位置优先级


对于SpringBoot项目来说,有3种常用来绑定指定配置文件的注解:​​​​​@PropertySource,@ImportResource@Bean

想看默认配置绑定看这篇:SpringBoot 第一课(Ⅱ)配置文件注入-CSDN博客文章浏览阅读500次,点赞7次,收藏14次。需要为每个属性单独指定,适用于简单的配置或单个属性的注入。属性上,Spring Boot 会处理这种命名风格的差异。使用@ConfigurationProperties注入。),而松散绑定支持这三种名字互通,就比如配置文件里的。允许一次性注入整个对象,适用于复杂的配置结构。Java中常见命名规则有驼峰命名法(实现上面操作后,就可以通过访问“使用注解时,在处理复杂情况时, https://blog.csdn.net/m0_74977981/article/details/146282864?spm=1001.2014.3001.5501

一、@PropertySource

配置文件

在里面编写:

student1.name=admin
student1.age=20
student1.id=1

Java实体类

package com.qcby.entity1;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;@Component
@PropertySource(value="classpath:student1.properties")
@ConfigurationProperties(prefix="student1")
public class Student1 {private String name;private int age;private int id;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "Student1{" +"name='" + name + '\'' +", age=" + age +", id=" + id +'}';}
}

现在我们需要测试这个类:
在test路径下测试:

注意这里SpringBoot项目在创建时会自动生成这么一个test类(如下):

为了方便查看,我们再在它旁边创建一个StudentTest类:

package com.qcby.sbdemotest01;import com.qcby.entity1.Student1;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** 从Spring Boot 2.2版本开始,@SpringBootTest 已经包含了 SpringRunner 的功能,* 因此在大多数情况下,工程师不再需要显式地使用 @RunWith(SpringRunner.class)。*/
//@RunWith(SpringRunner.class)  
//我用的是2.7.0,所以不用显式这一行【我在这里显式加上它的话,日志会报错警告(虽然能用吧)】(但是要知道有这么一个注释)
@SpringBootTest
public class StudentTest {@AutowiredStudent1 student1;@Testvoid contextLoads() {System.out.println(student1);}}

得到结果:

注意: 在Spring中,classpath是一个特殊的路径前缀,在SpringBoot项目中,默认代表的根目录一般是src/main/resources。

①规范情况

即假设一个项目的目录结构是:

src/
├── main/
│   ├── java/
│   │   └── com/example/Student1.java
│   └── resources/
│       ├── student1.properties
│       └── beans.xml

那么会在实体类中这么书写:

@PropertySource("classpath:config.properties")

②嵌套子目录

src/
├── main/
│   ├── java/
│   │   └── com/example/Student1.java
│   └── resources/
│       └── config/
│           ├── student1.properties
│           └── beans.xml

此时在实体类中定义时,就要加上目录路径前缀:

@PropertySource("classpath:config/config.properties")

不只是@PropertySource,其他用到classpath的地方同样遵循这个准则。

二、@ImportResource

在讲@ImportResource这里时,结合Spring框架全注解实现配置一起。

详文参照:Spring(二)---基于注解的方式实现Bean管理和注入属性_有没有注解可以实现bean动态注入,配置项打开注入,关闭则剔除-CSDN博客文章浏览阅读488次,点赞9次,收藏6次。①:注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...)②:使用注解,注解作用在类上面,方法上面,属性上边③:使用注解的目的:简化XML配置。_有没有注解可以实现bean动态注入,配置项打开注入,关闭则剔除 https://blog.csdn.net/m0_74977981/article/details/144626708?spm=1001.2014.3001.5501

①SpringConfig (Spring框架全注解)

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ComponentScan;@Configuration
@ComponentScan(value = "com.qcby")
public class SpringConfig {
}
  • @Configuration 注解:标识这是一个配置类,Spring容器会扫描这个类中定义的Bean。

  • @ComponentScan 注解:指定Spring容器扫描的包。在这个例子中,Spring容器会扫描 com.qcby 包及其子包中的所有Spring组件(如 @Component, @Service, @Repository 等),并将它们注册为Spring容器中的Bean。

这种方式是基于Java的配置,它允许项目通过Java代码来定义Spring容器的配置(并且是范围性的)。

②@ImportResource注解实现

配置类

@Configuration
@ImportResource("classpath:applicationContext.xml")
public class AppConfig {// 配置类中的其他配置
}

resources路径下的:applicationContext.xml

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- <context:component-scan base-package="com.qcby" /> --><!-- 扫描可以选择范围扫描或是逐一注入 --><!-- 逐一声明Bean --><bean id="myBean" class="com.qcby.MyBean" />
</beans>
  • @Configuration 注解:同样标识这是一个配置类。
  • @ImportResource 注解:用于导入一个XML配置文件。在这个例子中,它导入了类路径下的 applicationContext.xml 文件。这种方式允许你将配置信息放在XML文件中,而不是Java代码中。

三、@Bean

在Spring Boot中,推荐使用全注解的方式来配置和添加组件到Spring容器中。这种方式不仅代码更简洁,而且易于维护和理解。下面我将详细解释如何使用 @Configuration@Bean 注解来实现这一过程。

接口

package com.qcby.service;public interface HelloService {void sayHello();
}

Java实现类

package com.qcby.service;import org.springframework.stereotype.Service;@Service
public class SimpleHelloService implements HelloService {@Overridepublic void sayHello() {System.out.println("Hello, Spring Boot!");}
}

在这个例子中,SimpleHelloService 类被标记为 @Service,这表示它是一个服务层组件,Spring会自动将其注册为一个Bean。

MyAppConfig类:

我们创建一个配置类 MyAppConfig,并在其中使用 @Bean 注解来声明一个Bean。

package com.qcby.service;import com.qcby.service.HelloService;
import com.qcby.service.SimpleHelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;@Configuration
public class MyAppConfig {@Bean@Primary // 指定为首选beanpublic HelloService helloService02() {System.out.println("配置类@Bean给容器中添加组件了...");return new SimpleHelloService();}
}

在这个配置类中,我们使用 @Bean 注解声明了一个 HelloService 类型的Bean。这意味着Spring容器将创建一个 SimpleHelloService 实例,并将其注册为 HelloService 类型的Bean。

 创建Test类确认是否调用正确:

package com.qcby.sbdemotest01;import com.qcby.service.HelloService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class HelloServiceTest  {@Autowiredprivate HelloService helloService;@Testvoid contextLoads() {helloService.sayHello();}}

得到结果:

四、多配置文件

Spring Boot 支持多环境配置,允许为不同的环境(如开发、测试、生产等)创建不同的配置文件。这是通过使用不同的配置文件来实现的,这些文件可以是 .properties 格式或 .yml。

多Profile文件的使用

文件命名约定

对于 .properties 文件,可以使用 application-{profile}.properties 来命名不同的配置文件。例如:

  • application-dev.properties:开发环境的配置文件。

  • application-test.properties:测试环境的配置文件。

  • application-prod.properties:生产环境的配置文件。

默认情况下,如果没有指定环境,Spring Boot 会使用 application.properties 文件。

激活Profile

可以通过多种方式激活特定的Profile:

  • 在启动应用时,通过命令行参数指定:java -jar your-application.jar --spring.profiles.active=dev 【终端】

  • application.propertiesapplication.yml 文件中指定:spring.profiles.active=dev【配置文件中】

  • 在环境变量中设置:export SPRING_PROFILES_ACTIVE=dev(Linux/Mac)set SPRING_PROFILES_ACTIVE=dev(Windows)【操作系统级别】

YAML文件支持多文档块

YAML文件支持多文档块方式,这意味着可以在一个YAML文件中定义多个配置块,每个块对应一个Profile。例如:

spring:profiles: devapplication:name: MyApplication---
spring:profiles: testapplication:name: MyTestApplication---
spring:profiles: prodapplication:name: MyProductionApplication

在这个例子中,我们定义了三个配置块,每个块对应一个不同的Profile(开发、测试、生产)。Spring Boot会根据激活的Profile加载相应的配置块。

五、配置加载位置优先级

Spring Boot在启动时会按照一定的顺序扫描并加载配置文件,这些配置文件的位置和优先级如下:

  1. file:./config/:项目根目录下的config文件夹中。

  2. file:./:项目根目录中。

  3. classpath:/config/:类路径下的config文件夹中。

  4. classpath:/:类路径根目录中。

Spring Boot会从这四个位置加载application.propertiesapplication.yml文件作为默认配置文件,优先级由高到低,高优先级的配置会覆盖低优先级的配置。这意味着如果同一配置项在多个文件中出现,那么优先级高的文件中的配置将被使用。

/myproject
    /src
        /main
            /java
                /com
                    /yourcompany
                        /YourApplication.java
            /resources
                application.properties
    /config
        application.properties
    application.properties

即:

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

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

相关文章

深度解析React Native底层核心架构

React Native 工作原理深度解析 一、核心架构&#xff1a;三层异构协作体系 React Native 的跨平台能力源于其独特的 JS层-Shadow层-Native层 架构设计&#xff0c;三者在不同线程中协同工作&#xff1a; JS层 运行于JavaScriptCore&#xff08;iOS&#xff09;或Hermes&…

对话智能体的正确打开方式:解析主流AI聊天工具的核心能力与使用方式

一、人机对话的黄金法则 在与人工智能对话系统交互时&#xff0c;掌握以下七项核心原则可显著提升沟通效率&#xff1a;文末有教程分享地址 意图精准表达术 采用"背景需求限定条件"的结构化表达 示例优化&#xff1a;"请用Python编写一个网络爬虫&#xff08…

Xinference大模型配置介绍并通过git-lfs、hf-mirror安装

文章目录 一、Xinference开机服务systemd二、语言&#xff08;LLM&#xff09;模型2.1 配置介绍2.2 DeepSeek-R1-Distill-Qwen-32B&#xff08;大杯&#xff09;工具下载git-lfs&#xff08;可以绕过Hugging Face&#xff09; 2.3 DeepSeek-R1-Distill-Qwen-32B-Q4_K_M-GGUF&am…

MyBatis操纵数据库-XML实现(补充)

目录 一.多表查询二.MyBatis参数赋值(#{ }和${ })2.1 #{ }和${ }的使用2.2 #{ }和${ }的区别2.3 SQL注入2.3 ${ }的应用场景2.3.1 排序功能2.3.2 like查询 一.多表查询 多表查询的操作和单表查询基本相同&#xff0c;只需改变一下SQL语句&#xff0c;同时也要在实体类中创建出…

快速导出接口设计表——基于DOMParser的Swagger接口详情半自动化提取方法

作者声明&#xff1a;不想看作者声明的&#xff08;需要生成接口设计表的&#xff09;直接前往https://capujin.github.io/A2T/。 注&#xff1a;Github Pages生成的页面可能会出现访问不稳定&#xff0c;暂时没将源码上传至Github&#xff0c;如有需要&#xff0c;可联系我私…

TS常见内置映射类型的实现及应用场景

以下是 TypeScript 在前端项目中 常用的映射类型&#xff08;Mapped Types&#xff09;&#xff0c;结合具体场景和代码示例&#xff0c;帮助开发者高效处理复杂类型&#xff1a; 一、基础映射类型 1. Partial<T> 作用&#xff1a;将对象类型 T 的所有属性变为可选。 实…

介绍如何使用YOLOv8模型进行基于深度学习的吸烟行为检测

下面为你详细介绍如何使用YOLOv8模型进行基于深度学习的吸烟行为检测&#xff0c;包含环境配置、数据准备、模型训练以及推理等步骤。 1. 环境配置 首先&#xff0c;你需要安装必要的库&#xff0c;主要是ultralytics库&#xff0c;它包含了YOLOv8模型。你可以使用以下命令进…

AI-医学影像分割方法与流程

AI医学影像分割方法与流程–基于低场磁共振影像的病灶识别 – 作者:coder_fang AI框架&#xff1a;PaddleSeg 数据准备&#xff0c;使用MedicalLabelMe进行dcm文件标注&#xff0c;产生同名.json文件。 编写程序生成训练集图片&#xff0c;包括掩码图。 代码如下: def doC…

【Python】09、字典

文章目录 1. 字典简介2. 字典的使用2.1 字典创建2.2 字典值获取2.3 字典值修改2.4 字典的删除 3. 字典的遍历 1. 字典简介 字典(dict)属于一种新的数据结构&#xff0c;称为映射(mapping)。 字典的作用和列表类似&#xff0c;但是查询性能比列表好&#xff1b;在字典中每个元…

【贪心算法4】

力扣452.用最少数量的剪引爆气球 链接: link 思路 这道题的第一想法就是如果气球重叠得越多那么用箭越少&#xff0c;所以先将气球按照开始坐标从小到大排序&#xff0c;遇到有重叠的气球&#xff0c;在重叠区域右边界最小值之前的区域一定需要一支箭&#xff0c;这道题有两…

SGMEA: Structure-Guided Multimodal Entity Alignment

3 Method 3.1 Problem Definition 3.2 Framework Description 总体框架如图2所示&#xff0c;由三个主要部分组成&#xff1a;初始嵌入采集模块、结构引导模块和模态融合模块。 3.3 Initial Embedding Acquisition 3.3.1 Structural Embedding 3.3.2 Relation, Attribute, …

KY-038 声音传感器如何工作以及如何将其与 ESP32 连接

想为您的项目赋予声音感!然后跟着做,因为在这个项目中,我们将连接一个声音传感器,用它构建一些有趣的项目。我们使用的 KY-038 声音传感器使用电容式麦克风来检测声波,这为我们提供了稳定性和可靠性的完美平衡。因此,在本文中,我们决定将 KY-038 传感器与 ESP32 连接,并…

《基于超高频RFID的图书馆管理系统的设计与实现》开题报告

一、研究背景与意义 1.研究背景 随着信息化时代的到来&#xff0c;运用计算机科学技术实现图书馆的管理工作已成为优势。更加科学地管理图书馆会大大提高工作效率。我国的图书管理体系发展经历了三个阶段&#xff1a;传统图书管理模式、现代图书管理模式以及基于无线射频识别&…

[local-file-system]基于服务器磁盘的本地文件存储方案

[local-file-system]基于服务器磁盘的本地文件存储方案 仅提供后端方案 github 环境 JDK11linux/windows/mac 应用场景 适用于ToB业务&#xff0c;中小企业的单体服务&#xff0c;仅使用磁盘存储文件的解决方案 仅使用服务器磁盘存储 与业务实体相结合的文件存储方案&…

P5708 【深基2.习2】三角形面积(洛谷—python)

题目描述 一个三角形的三边长分别是 a、b、c&#xff0c;那么它的面积为 p(p−a)(p−b)(p−c)​&#xff0c;其中 p21​(abc)。输入这三个数字&#xff0c;计算三角形的面积&#xff0c;四舍五入精确到 1 位小数。 输入格式 第一行输入三个实数 a,b,c&#xff0c;以空格隔开…

智慧加油站小程序数据库设计文档

智慧加油站系统 - 数据库与API设计文档 1. 数据库设计 1.1 ER模型 系统的核心实体关系如下&#xff1a; 用户(User) ---< 订单(Order) ---< 加油记录(RefuelRecord)| | || | vv v …

C++博客分享

本周的一些 C视频分享, 或许后续会做一些内容总结. 博客 Polymorphic, Defaulted EqualityConstexpr factors_ofC26: Removing language featuresBypassing the branch predictor Meeting C 2024 Clean CMake for C (library) developers - Kerstin KellerAn Introduction …

【蓝桥杯每日一题】3.16

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 目录 3.9 高精度算法 一、高精度加法 题目链接&#xff1a; 题目描述&#xff1a; 解题思路&#xff1a; 解题代码&#xff1a; 二、高精度减法 题目链接&#xff1a; 题目描述&…

vue 仿deepseek前端开发一个对话界面

后端&#xff1a;调用deepseek的api&#xff0c;所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…

SpringMVC(五)拦截器

目录 拦截器基本概念 一 单个拦截器的执行 1 创建拦截器 2 SpringMVC配置&#xff0c;并指定拦截路径。 3 运行结果展示&#xff1a; 二 多个拦截器的执行顺序 三 拦截器与过滤器的区别 拦截器基本概念 SpringMVC内置拦截器机制&#xff0c;允许在请求被目标方法处理的…