1. 使用@Value
注解
@Value
注解是最直接且常用的读取配置的方式。它可以将配置文件中的属性值注入到Spring管理的Bean的字段中。
@Component
public class MyBean {
@Value("${some.key1}")
private String someKey1;
@Value("${some.key2:defaultVal}")
private String someKey2;
public void initSomeKey3(@Value("${some.key3}")String key){
...
}
}
ConfigurationProperties
注解ConfigurationProperties
注解允许将配置文件的属性绑定到一个Bean上,这样可以更方便地管理和使用配置信息。与@Value
注解相比,ConfigurationProperties
支持复杂类型的配置,如列表、集合等。
@Component
@ConfigurationProperties(prefix = "some")
public class SomeProperties {
private String key;
private List<String> values;
// ... getters and setters
}
@ConfigurationProperties使用注意事项:
student.name
会自动映射到类字段name
上。@Value("${my.property:default-value}")
。required
属性来指定某个属性是否为必需的。Environment
对象Environment
对象提供了访问配置信息的方法。可以通过注入Environment
对象来获取配置属性值。
@Component
public class MyBean {
private final Environment environment;
@Autowired
public MyBean(Environment environment) {
this.environment = environment;
}
public void someMethod() {
String someKey = environment.getProperty("some.key");
// ...
}
}
// 通过获取Environment
@Component
public class MyEnvironmentAware implements EnvironmentAware {
private Environment env;
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
public String getKey() {
return env.getProperty("some.key");
}
}
@PropertySource
注解@PropertySource
注解允许指定额外的属性文件作为配置源。这对于读取非application.properties
或application.yml
文件中的配置非常有用。
/**
* 绑定自定义properties配置
*/
@Data
@Configuration
@PropertySource("classpath:custom.properties")
public class MyPropertiesComponent {
@Value("${some.key}")
private String someKey;
// ...
}
在某些情况下,需要读取非标准的配置文件(如JSON、XML等)。这时,可以通过编写自定义的配置文件读取逻辑来实现。例如,使用Jackson库来读取JSON配置文件。
@Service
public class ConfigService {
private MyConfig config;
@PostConstruct
public void init() throws IOException {
ObjectMapper mapper = new ObjectMapper();
InputStream inputStream = new ClassPathResource("config.json").getInputStream();
this.config = mapper.readValue(inputStream, MyConfig.class);
}
// ... 使用config的方法
}
Spring Boot应用也支持通过命令行参数来传递配置信息。可以通过实现CommandLineRunner
接口来访问命令行参数。
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class CommandLineAppStartupRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
if (args.length > 0) {
System.out.println("接收到命令行参数:");
for (String arg : args) {
System.out.println(arg);
}
} else {
System.out.println("没有接收到命令行参数。");
}
}
}
打包并运行Spring Boot应用。在运行时通过命令行传递参数。
java -jar your-spring-boot-app.jar arg1 arg2 arg3
arg1、arg2和arg3是作为命令行参数传递给应用的.
SpEL可以在@Value
注解中使用,以更复杂的表达式形式来读取配置值。例如,可以结合系统属性或环境变量来动态获取配置。
@Value("#{systemProperties['some.key'] ?: 'default'}")
private String someKey;
Spring Boot提供了多种灵活且强大的方式来读取配置信息。开发者可以根据具体需求和场景选择最适合的方法来管理和使用配置。无论是简单的键值对还是复杂的配置结构,Spring Boot都能提供相应的支持来简化配置读取的过程。