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.pswp.cn/pingmian/72521.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72521.shtml
英文地址,請注明出處:http://en.pswp.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;允許在請求被目標方法處理的…