Spring Boot通过外部化配置来让应用程序在不同环境下以相同的代码运行。配置数据可以存储在不同的位置和形式,并且可以通过属性文件、yaml文件、环境变量等多种方式进行配置。
1. 引入外部化配置的依赖
在pom.xml文件中,引入以下依赖即可实现外部化配置功能:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
2. 添加配置文件
添加一个名为application.properties或application.yml的文件,存储需要外部化的配置数据。这些配置数据可以存储在本地文件系统中、远程服务中或者云上存储中,具体取决于应用程序的需求。
例如,下面是一个application.properties文件的示例:
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=123456
或者,下面是一个application.yml文件的示例:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb
username: root
password: 123456
3. 使用配置数据
Spring Boot会自动将配置数据绑定到指定的Java对象中,这样可以方便地在应用程序中使用这些配置信息。在Java代码中,可以使用@Value注解或@ConfigurationProperties注解获取配置数据。
3.1 使用@Value注解获取配置数据
使用@Value注解可以直接获取配置文件中的某个属性值。例如:
@RestController
public class MyController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/hello")
public String hello() {
return "Hello World! The server port is " + serverPort;
}
}
3.2 使用@ConfigurationProperties注解获取配置数据
@ConfigurationProperties注解可以将配置文件中的一组属性值绑定到一个Java对象中。例如:
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {
private String url;
private String username;
private String password;
// getters and setters
}
然后,在Spring Boot配置类中,使用@EnableConfigurationProperties注解和@ConfigurationPropertiesScan注解开启自动装配:
@EnableConfigurationProperties(DataSourceProperties.class)
@ConfigurationPropertiesScan
@SpringBootApplication
public class MyApp {
// ...
}
最后,在需要使用数据源的地方,注入该数据源即可:
@Autowired
private DataSourceProperties dataSourceProperties;
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(dataSourceProperties.getUrl());
dataSource.setUsername(dataSourceProperties.getUsername());
dataSource.setPassword(dataSourceProperties.getPassword());
return dataSource;
}
4. 示例说明
4.1 从远程配置服务器中获取配置数据
在实际开发中,为了方便管理不同环境下的配置文件,可以将所有的配置文件集中保存在一个中央配置服务器上,开发人员只需要在代码中指定此中心配置服务器的地址和应用程序的Profile环境即可自动下载对应的配置文件。
示例代码如下:
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
@Bean
public ConfigurableEnvironment configurableEnvironment(Environment environment) {
ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment;
String configUrl = "http://localhost:8888";
String profile = "dev";
String appId = "myapp";
String configServerUrl = configUrl + "/" + appId + "-" + profile + ".yaml";
ResourcePropertySource source = loadYamlFromUrl(configServerUrl);
configurableEnvironment.getPropertySources().addLast(source);
return configurableEnvironment;
}
private ResourcePropertySource loadYamlFromUrl(String url) {
try {
InputStream inputStream = new URL(url).openStream();
YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
yamlFactory.setResources(new InputStreamResource(inputStream));
Properties properties = yamlFactory.getObject();
return new ResourcePropertySource(new ClassPathResource("application.yaml"), properties);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
在上面的代码中,通过读取远程配置服务器中的配置文件,设置到应用程序的环境中,这样就可以获取到其他环境下的配置文件中的属性。
4.2 在Docker容器中运行应用程序时使用外部化配置
使用Docker运行Spring Boot应用程序时,可以将配置文件挂载到容器的某个路径中,从而实现应用程序的外部化配置。
示例代码如下:
FROM openjdk:11.0.2-jdk-slim
COPY target/myapp.jar /app.jar
VOLUME /config
ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.config.location=file:/config/"]
在上面的代码中,将应用程序运行的配置位置指定为外部挂载的/config目录,这样容器中的应用程序会自动读取/config目录中的配置文件进行配置,并在应用程序运行时使用这些配置信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot外部化配置使用Plus版的方法示例 - Python技术站