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

news2025/3/18 13:50:05

目录

一、@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;
    }

    @Override
    public 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 {
    @Autowired
    Student1 student1;
    @Test
    void 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/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://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 {
    @Override
    public 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 // 指定为首选bean
    public 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  {
    @Autowired
    private HelloService helloService;

    @Test
    void 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: dev
  application:
    name: MyApplication

---
spring:
  profiles: test
  application:
    name: MyTestApplication

---
spring:
  profiles: prod
  application:
    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.coloradmin.cn/o/2317255.html

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

相关文章

Excel(函数篇):COUNTIF与CONUTIFS函数、SUMIF与SUMIFS函数、ROUND函数、MATCH与INDEX函数、混合引用与条件格式

目录 COUNTIF和COUNTIFS函数COUNTIF函数COUNTIFS函数SUMIF和SUMIFS函数SUMIF函数SUMIFS函数SUMIFS函数与控件实现动态年月汇总ROUND、ROUNDUP、ROUNDDOWN函数单元格混合引用条件格式与公式,标记整行数据MATCH和INDEX函数COUNTIF和COUNTIFS函数 COUNTIF函数 统计下“苏州”出现…

虚拟定位 1.2.0.2 | 虚拟定位,上班打卡,校园跑步模拟

Fake Location是一款运行于安卓平台上的功能强大、简单实用的虚拟定位软件。它能够帮助用户自定义位置到地图上的任意地方&#xff0c;以ROOT环境运行不易被检测&#xff0c;同时也支持免ROOT运行。提供路线模拟、步频模拟、WIFI模拟等方式&#xff0c;支持反检测。 大小&…

【最大异或和——可持久化Trie】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 6e510; //注意这里起始有3e5&#xff0c;又可能插入3e5 const int M N * 25;int rt[N], tr[M][2]; //根&#xff0c;trie int idx, cnt, br[M]; //根分配器&#xff0c;点分配器&#xff0c;点的相…

C# WPF编程-启动新窗口

C# WPF编程-启动新窗口 新建窗口&#xff1a; 工程》添加》窗口 命名并添加新的窗口 这里窗口名称为Window1.xaml 启动新窗口 Window1 win1 new Window1(); win1.Show(); // 非模态启动窗口win1.ShowDialog(); // 模态启动窗口 模态窗口&#xff1a;当一个模态窗口被打开时&a…

Python 实现大文件的高并发下载

项目背景 基于一个 scrapy-redis 搭建的分布式系统&#xff0c;所有item都通过重写 pipeline 存储到 redis 的 list 中。这里我通过代码演示如何基于线程池 协程实现对 item 的中文件下载。 Item 结构 目的是为了下载 item 中 attachments 保存的附件内容。 {"crawl_tim…

【最新】 ubuntu24安装 1panel 保姆级教程

系统&#xff1a;ubuntu24.04.1 安装软件 &#xff1a;1panel 第一步&#xff1a;更新系统 sudo apt update sudo apt upgrade 如下图 第二步&#xff1a;安装1panel&#xff0c;运行如下命令 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o …

c++图论(二)之图的存储图解

在 C 中实现图的存储时&#xff0c;常用的方法包括 邻接矩阵&#xff08;Adjacency Matrix&#xff09;、邻接表&#xff08;Adjacency List&#xff09; 和 边列表&#xff08;Edge List&#xff09;。以下是具体实现方法、优缺点分析及代码示例&#xff1a; 1. 邻接矩阵&…

c++图论(一)之图论的起源和图的概念

C 图论之图论的起源和图的概念 图论&#xff08;Graph Theory&#xff09;是数学和计算机科学中的一个重要分支&#xff0c;其起源可以追溯到 18 世纪 的经典问题。以下是图论的历史背景、核心起源问题及其与基本概念和用途&#xff1a; 借用一下CSDN的图片哈 一、图论的起源&…

ChatGPT and Claude国内使用站点

RawChat kelaode chatgptplus chatopens&#xff08;4.o mini免费&#xff0c;plus收费&#xff09; 网页&#xff1a; 定价&#xff1a; wildcard 网页&#xff1a; 虚拟卡定价&#xff1a; 2233.ai 网页&#xff1a; 定价&#xff1a; MaynorAPI chatgpt cla…

进行性核上性麻痹:精心护理,点亮希望之光

进行性核上性麻痹是一种罕见的神经退行性疾病&#xff0c;严重影响患者的生活质量。有效的健康护理能够在一定程度上缓解症状、延缓病情发展&#xff0c;给患者带来更好的生活体验。 在日常生活护理方面&#xff0c;由于患者平衡能力逐渐下降&#xff0c;行动不便&#xff0c;居…

ZED X系列双目3D相机的耐用性与创新设计解析

在工业自动化和学术研究领域&#xff0c;高精度的视觉设备正成为提升效率和质量的关键。ZED X系列AI立体相机&#xff0c;凭借其先进的技术和耐用的设计&#xff0c;为这一领域带来了新的可能。 核心技术&#xff1a;深度感知与精准追踪 ZED X系列的核心技术之一是Neural Dept…

HarmonyOS三层架构实战

目录&#xff1a; 1、三层架构项目结构1.0、三层架构简介1.1、 common层&#xff08;主要放一些公共的资源等&#xff09;1.2、 features层&#xff08;主要模块定义的组件以及图片等静态资源&#xff09;1.3、 products层&#xff08;主要放主页面层和一些主要的资源&#xff…

计算机四级 - 数据库原理 - 第4章 「关系数据库标准语言SQL」

4.1 SQL概述 4.1.1 结构化查询语言SQL SQL(Structured Query Language)称为结构化查询语言&#xff0c;它是由1974年由Boyce和Chamberi提出的&#xff0c;1975年至1979年IBM公司的San Jose Research Laboratory研制了关系数据库管理系统的原型系统System R,并实现了这种语198…

基于PMU的14节点、30节点电力系统状态估计MATLAB程序

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序简介&#xff1a; 程序采用三种方法对14节点和30节点电力系统状态进行评估&#xff1a; ①PMU同步向量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; …

Deepseek API+Python测试用例一键生成与导出-V1.0.2【实现需求文档图片识别与用例生成自动化】

在测试工作中&#xff0c;需求文档中的图片&#xff08;如界面设计图、流程图&#xff09;往往是测试用例生成的重要参考。然而&#xff0c;手动提取图片并识别内容不仅耗时&#xff0c;还容易出错。本文将通过一个自研小工具&#xff0c;结合 PaddleOCR 和大模型&#xff0c;自…

整形在内存中的存储(例题逐个解析)

目录 一.相关知识点 1.截断&#xff1a; 2.整形提升&#xff1a; 3.如何 截断&#xff0c;整型提升&#xff1f; &#xff08;1&#xff09;负数 &#xff08;2&#xff09;正数 &#xff08;3&#xff09;无符号整型&#xff0c;高位补0 注意&#xff1a;提升后得到的…

蓝牙系统的核心组成解析

一、硬件层&#xff1a;看得见的物理载体 1. 射频模块&#xff08;Radio Frequency Module&#xff09; 专业描述&#xff1a;工作在2.4GHz ISM频段&#xff0c;支持GFSK/π/4 DQPSK/8DPSK调制方式 功能类比&#xff1a;相当于人的"嘴巴"和"耳朵" 发射端…

uniapp笔记-底部和首部标签页菜单生成

逻辑 这些都是需要配置pages.json文件。 其中底部需要手动配置tarBar&#xff0c;如&#xff1a; "tabBar": {"list":[{"pagePath": "pages/index/index","text": "首页"},{"pagePath": "pages/…

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序&#xff0c;虽然不是特别复杂的游戏&#xff0c;但是是第一次写&#xff0c;肯定要记录一下了&#xff0c;哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏&#xff0c;类似下…

OpenCV计算摄影学(21)非真实感渲染之边缘保留滤波器edgePreservingFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 滤波是图像和视频处理中的基础操作。边缘保留平滑滤波器被广泛应用于多种不同场景[98]。 cv::edgePreservingFilter 是一种边缘保留滤波器&#…