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.rhkb.cn/news/34540.html

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

相关文章

2025年西安交通大学少年班招生考试初试数学试题(初中组)

1、已知正整数 x 、 y 、 z x、y、z x、y、z 满足 x y z 2025 xyz2025 xyz2025 &#xff0c; x 2 y y 2 z z 2 x x y 2 y z 2 z x 2 x^2yy^2zz^2xxy^2yz^2zx^2 x2yy2zz2xxy2yz2zx2&#xff0c;则 x 、 y 、 z x、y、z x、y、z 共有 ___ 组解。 2、在数 1 、 2 、 …

开发、科研、日常办公工具汇总(自用,持续更新)

主要记录汇总一下自己平常会用到的网站工具&#xff0c;方便查阅。 update&#xff1a;2025/2/11&#xff08;开发网站补一下&#xff09; update&#xff1a;2025/2/21&#xff08;补充一些AI工具&#xff0c;刚好在做AI视频相关工作&#xff09; update&#xff1a;2025/3/7&…

软件架构设计习题及复习

软件系统需求分析 系统需求模型转换为架构模型 软件架构设计 架构风格领域 难点 单选 平衡点是敏感点的一种&#xff0c;如果达到了平衡点一定要选平衡点&#xff0c;不能选敏感点添加层次不能提高系统性能&#xff0c;任何时候直接沟通性能最高效

ccf3501密码

//密码 #include<iostream> #include<cstring> using namespace std; int panduan(char a[]){int lstrlen(a);int s0;int zm0,sz0,t0;int b[26]{0},c[26]{0},d[10]{0},e0,f0;while(s<l&&l>6){if(a[s]<Z&&a[s]>A){b[a[s]-A];zm;}if(a[s…

【JavaEE进阶】Spring事务

目录 &#x1f343;前言 &#x1f334;事务简介 &#x1f6a9; 什么是事务? &#x1f6a9;为什么需要事务? &#x1f6a9;事务的操作 &#x1f340;Spring 中事务的实现 &#x1f6a9;Spring 编程式事务 &#x1f6a9;Spring声明式事务Transactional &#x1f6a9;T…

MySQL索引特性——会涉及索引的底层B+树

1 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是天下没有免…

给单片机生成字库的方案

Python 这段代码用来将txt文件中储存的字符串转变成二进制的像素数据 from PIL import Image, ImageFont, ImageDraw import osdef find_microsoft_yahei():"""Windows系统定位微软雅黑字体"""font_paths ["C:/Windows/Fonts/msyh.ttc&q…

01Spring Security框架

Spring Security是什么&#xff1f; Spring Security是⼀个提供身份验证、授权和针对常见攻击的保护的框架。 Spring Security做什么&#xff1f; 作为开发⼈员&#xff0c;在⽇常开发过程中需要⽤到Spring Security的场景⾮常多。事实上&#xff0c;对Web应⽤程序⽽⾔&#xf…

「BWAPP靶场通关记录(1)」A1注入漏洞

BWAPP通关秘籍&#xff08;1&#xff09;&#xff1a;A1 injection 1.HTML Injection - Reflected (GET)1.1Low1.2Medium1.3High 2.HTML Injection - Reflected (POST)2.1Low2.2Medium2.3High 3.HTML Injection - Reflected (URL)3.1Low3.2/3.3Medium/HIgh 4.HTML Injection - …

机器学习算法实战——敏感词检测(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 引言 随着互联网的快速发展&#xff0c;信息传播的速度和范围达到了前所未有的高度。然而&#xff0c;网络空间中也充斥着大量的…

Ollama+DeepSeek+NatCross内网穿透本地部署外网访问教程

目录 一、Ollama 简介 二、下载Ollama 三、下载并运行 DeepSeek 模型 四、运行 DeepSeek 模型 五、NatCross免费内网穿透 六、配置 ChatBox 连接 Ollama 七、外网使用ChatBox体验 一、Ollama 简介 Ollama 是一个开源的本地大模型部署工具&#xff0c;旨在让用户能够在个…

联想台式电脑启动项没有U盘

开机按F12&#xff0c;进入启动设备菜单&#xff0c;发现这里没有识别到插在主机的U盘&#xff1f; 解决方法 1、选上图的Enter Setup或者开机按F2&#xff0c;进入BIOS设置 选择Startup -> Primary Boot Sequence 2、选中“Excludeed from boot order”中U盘所在的一行 …

开源链动 2+1 模式 AI 智能名片 S2B2C 商城小程序助力社群发展中榜样影响力的提升

摘要&#xff1a;本文深入剖析了社群发展进程中榜样所承载的关键影响力&#xff0c;并对开源链动 21 模式 AI 智能名片 S2B2C 商城小程序在增强这一影响力方面所具备的潜力进行了全面探讨。通过对不同类型社群&#xff0c;如罗辑思维社群和 007 不出局社群中灵魂人物或意见领袖…

《交互式线性代数》

《交互式线性代数》 *Interactive Linear Algebra*由Dan Margalit和Joseph Rabinoff编写&#xff0c;是一本聚焦线性代数的教材。本书旨在教授线性代数的核心概念、方法及其应用&#xff0c;通过代数与几何相结合的方式&#xff0c;帮助读者深入理解线性代数的本质&#xff0c…

CSS -属性值的计算过程

目录 一、抛出两个问题1.如果我们学过优先级关系&#xff0c;那么请思考如下样式为何会生效2.如果我们学习过继承&#xff0c;那么可以知道color是可以被子元素继承使用的&#xff0c;那么请思考下述情景为何不生效 二、属性值计算过程1.确定声明值2.层叠冲突3.使用继承4.使用默…

生活中的可靠性小案例11:窗户把手断裂

窗户把手又断了&#xff0c;之前也断过一次&#xff0c;使用次数并没有特别多。上方的图是正常的把手状态&#xff0c;断的形状如下方图所示。 这种悬臂梁结构&#xff0c;没有一个良好的圆角过渡&#xff0c;导致应力集中。窗户的开关&#xff0c;对应的是把手的推拉&#xff…

怎么解决在Mac上每次打开文件夹都会弹出一个新窗口的问题

在Mac上每次打开文件夹都会弹出一个新窗口的问题&#xff0c;可以通过以下方法解决‌ ‌调整Finder设置‌&#xff1a; 打开Finder&#xff0c;点击“Finder”菜单&#xff0c;选择“偏好设置”。在偏好设置中&#xff0c;选择“通用”标签。取消勾选“在标签页中打开文件夹”或…

HOT100——栈篇Leetcode739. 每日温度

文章目录 题目&#xff1a;Leetcode160. 相交链表原题链接思路代码 题目&#xff1a;Leetcode160. 相交链表 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温…

C++ 返回值优化(Return Value Optimization)

Intro 返回值优化(Return Value Optimization, RVO)是 C中的一种编译器优化技术, 它允许编译器在某些情况下省略临时对象的创建和复制/移动操作, 从而提高程序性能. RVO 主要应用于函数返回值的场景. 两种形式的 RVO 假定我们有这样一个类: class MyClass {std::string nam…

C++内存管理(复习)

1.动态申请多个某类型的空间并初始化 //动态申请10个int类型的空间并初始化为0到9int* p new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; delete[] p; //销毁 2.new/delete new:开空间构造函数 delete:析构函数释放空间 new和delete是用户进行动态内存申请和释放的操作符&#…