@Value方式
在Spring框架中,@Value
注解用于将外部配置文件中的值注入到类的字段中。通过这种方式,可以灵活地配置应用程序,并且在需要更改配置时,只需修改配置文件即可,无需重新编译代码。
配置文件 application.properties
在 application.properties
文件中定义配置项:
# Application properties for testing @Value annotation
test.value.request.url=https://openapi.alipay.com/gateway.do
test.value.request.app.id=2019052960295228
test.value.request.sign.key=FFFFEA911121494981C5FEBA599C3A99
test.value.request.encrypted.key=EEEE9CA14DE545768A0BD9F1435EE507
test.value.request.timeout=20
ValueService Class
package com.alian.properties.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@Service
public class ValueService {
@Value("${test.value.request.url}")
private String requestUrl;
@Value("${test.value.request.app.id}")
private String requestAppId;
@Value("${test.value.request.sign.key}")
private String requestSignKey;
@Value("${test.value.request.encrypted.key}")
private String requestEncryptedKey;
@Value("${test.value.request.timeout:20}")
private int requestTimeout;
@PostConstruct
public void testValue() {
System.out.println("-------------------@Value Testing Starts-------------------");
System.out.println("Request URL: " + requestUrl);
System.out.println("Request App ID: " + requestAppId);
System.out.println("Request Sign Key: " + requestSignKey);
System.out.println("Request Encrypted Key: " + requestEncryptedKey);
System.out.println("Request Timeout (Default if not set): " + requestTimeout);
System.out.println("-------------------@Value Testing Ends-------------------");
}
}
@ConfigurationProperties方式(推荐)
当使用@ConfigurationProperties
时,您可以创建一个POJO(Plain Old Java Object)类来映射配置文件中的属性,并使用Spring的自动装配功能将配置值注入到该类的实例中。这种方式更符合面向对象的思想,并且提供了类型安全和更好的封装性。
# Application properties for testing @ConfigurationProperties annotation
test.value.request.url=https://openapi.alipay.com/gateway.do
test.value.request.app.id=2019052960295228
test.value.request.sign.key=FFFFEA911121494981C5FEBA599C3A99
test.value.request.encrypted.key=EEEE9CA14DE545768A0BD9F1435EE507
test.value.request.timeout=20
package com.alian.properties.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "test.value")
public class ValueProperties {
private String requestUrl;
private String requestAppId;
private String requestSignKey;
private String requestEncryptedKey;
private int requestTimeout;
// Getters and Setters
// You can generate getters and setters automatically in most IDEs,
// or you can write them manually if you prefer.
public String getRequestUrl() {
return requestUrl;
}
public void setRequestUrl(String requestUrl) {
this.requestUrl = requestUrl;
}
public String getRequestAppId() {
return requestAppId;
}
public void setRequestAppId(String requestAppId) {
this.requestAppId = requestAppId;
}
public String getRequestSignKey() {
return requestSignKey;
}
public void setRequestSignKey(String requestSignKey) {
this.requestSignKey = requestSignKey;
}
public String getRequestEncryptedKey() {
return requestEncryptedKey;
}
public void setRequestEncryptedKey(String requestEncryptedKey) {
this.requestEncryptedKey = requestEncryptedKey;
}
public int getRequestTimeout() {
return requestTimeout;
}
public void setRequestTimeout(int requestTimeout) {
this.requestTimeout = requestTimeout;
}
}
可以在任何需要使用这些配置属性的地方注入ValueProperties
类,并直接使用其实例变量:
package com.alian.properties.service;
import com.alian.properties.config.ValueProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@Service
public class ValueService {
@Autowired
private ValueProperties valueProperties;
@PostConstruct
public void testValue() {
System.out.println("-------------------@ConfigurationProperties Testing Starts-------------------");
System.out.println("Request URL: " + valueProperties.getRequestUrl());
System.out.println("Request App ID: " + valueProperties.getRequestAppId());
System.out.println("Request Sign Key: " + valueProperties.getRequestSignKey());
System.out.println("Request Encrypted Key: " + valueProperties.getRequestEncryptedKey());
System.out.println("Request Timeout (Default if not set): " + valueProperties.getRequestTimeout());
System.out.println("-------------------@ConfigurationProperties Testing Ends-------------------");
}
}
注意
-
属性前缀匹配:
@ConfigurationProperties
注解中的value
属性指定了配置文件中的属性前缀。例如,如果配置文件中有app.name
、app.version
等属性,它们将会被映射到@ConfigurationProperties
注解标记的类中。 -
使用@Data和@Component:
@Data
注解来自于Lombok库,用于自动生成类的Getter、Setter、equals、hashCode和toString等方法。@Component
注解用于将类标记为Spring组件,从而使得Spring能够扫描到并管理这个类。这两个注解通常与@ConfigurationProperties
一起使用,以便让Spring能够自动装配配置属性。 -
内部类对象: 如果配置类中包含内部类对象,则内部类也需要添加
@Data
注解,以确保能够正确地映射数据。如果内部类没有@Data
注解,Spring可能无法正确地映射配置文件中的属性到内部类对象中。 -
.properties文件映射规则: 当使用
.properties
类型的配置文件时,配置属性的命名约定是,短横线(-)后面的首个字母会变成大写。例如,如果配置文件中有app.max-connections=100
,则在Java中对应的属性名称应该是maxConnections
。 -
内部类的写法: 如果配置类中有内部类对象,通常建议将内部类声明为静态内部类,并且添加
@Data
注解。这样可以确保内部类能够正确地映射数据,并且避免因为内部类对象的引用而导致的潜在问题。
Environment方式
要获取Spring中的Environment
对象,可以通过@Autowired
注解将其注入到您的类中。这样做允许在类中使用Environment
对象来获取应用程序的配置信息、活动的Profile等。以下是获取Environment
对象的方法:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class YourClass {
@Autowired
private Environment env;
public void yourMethod() {
// 使用Environment对象获取配置属性值
String propertyValue = env.getProperty("your.property.name");
// 获取活动的Profile
String[] activeProfiles = env.getActiveProfiles();
for (String profile : activeProfiles) {
System.out.println("Active Profile: " + profile);
}
}
}
- 通过将
Environment
对象注入到YourClass
中,可以在类中使用env
对象来获取配置属性值以及活动的Profile信息。 - 记住,在使用
@Autowired
注解注入Environment
对象时,确保类已经被Spring管理,通常使用@Component
或其他适当的注解来标记类。 - 使用Environment对象获取配置文件的值,最好使用带默认值的方法:getProperty(“配置项key”,“默认值”),避免null值使用Environment对象获取配置文件的值,最好使用带默认值的方法:getProperty(“配置项key”,“默认值”),避免null值
@PropertySource方式
@PropertySource
注解允许您将外部属性文件加载到Spring的环境中,从而可以在应用程序中访问这些属性。下面是如何使用@PropertySource
注解来加载外部属性文件的示例:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:alian.properties")
public class YourClass {
@Value("${db.url}")
private String dbUrl;
@Value("${db.username}")
private String dbUsername;
@Value("${db.password}")
private String dbPassword;
// 其他代码...
}
也可以这样
#博客用户
csdn.user-name=Alian
#博客密码
csdn.password=123456
#博客地址
csdn.blog-url=https://blog.csdn.net/Alian_1223
#博客描叙
csdn.blog-desp=来来来,一起聊干货!!!
package com.alian.properties.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "csdn")
@PropertySource(value = "classpath:alian.properties", encoding = "UTF-8", ignoreResourceNotFound = true)
public class ALianProperties {
private String userName;
private String password;
private String blogUrl;
private String blogDesp;
}
请注意以下几点:
- @ConfigurationProperties(value = “csdn”)表示配置文件里属性的前缀都是csdn开头
- @PropertySource中value属性表示指定配置文件的路径,encoding属性表示指定的是读取配置文件时的编码,记得和文件alian.properties的编码保持一致,ignoreResourceNotFound属性值为true时没找到指定配置文件的时候不报错
- 配置类上记得加上@Component注解
- yml 格式不支持这样导入配置
@PropertySource
中的路径是相对于类路径的,因此在示例中使用了classpath:
前缀。- 在加载外部属性文件之后,可以通过
@Value
注解直接将属性值注入到类的字段中。 - 为了使用
@Value
注解,需要确保YourClass
类被Spring管理,通常使用@Component
或其他适当的注解来标记类。
直接代码获取
无论是.properties文件还是.yml文件,其内容都遵循了类似的键值对的结构。每一行包含一个键值对,键与值之间使用等号(=)或冒号(:)分隔,注释可以使用井号(#)或双斜杠(//)开头。
.properties文件的格式相对简单,适用于简单的配置需求。而.yml文件则更加灵活和易读,支持层级结构,适用于复杂的配置情景。
# Database Configuration
db.url=jdbc:mysql://localhost:3306/mydatabase
db.username=admin
db.password=secret
# Server Configuration
server.port=8080
server.host=localhost
# Database Configuration
db:
url: jdbc:mysql://localhost:3306/mydatabase
username: admin
password: secret
# Server Configuration
server:
port: 8080
host: localhost
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
Properties properties = new Properties();
InputStream input = null;
try {
// 读取外部属性文件
input = new FileInputStream("alian.properties");
// 加载属性文件到Properties对象
properties.load(input);
// 获取属性值
String dbUrl = properties.getProperty("db.url");
String dbUsername = properties.getProperty("db.username");
String dbPassword = properties.getProperty("db.password");
// 打印属性值
System.out.println("DB URL: " + dbUrl);
System.out.println("DB Username: " + dbUsername);
System.out.println("DB Password: " + dbPassword);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
// 关闭输入流
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}