自学内容网 自学内容网

SpringBoot开发使用@ConfigurationProperties代替@Value笔记

一、背景

最近在项目开发中,遇到大量配置信息在不同微服务中使用,发现维护配置信息变得越来越复杂,修改一个配置命名,就要连着改好多@Value,因为配置管理而头疼。

二、@Value注解

可以轻松地将配置文件中的值注入到Spring Bean中。例如:

@Value("${app.name}")
private String appName;

通过@Value注解将配置文件中的app.name属性注入到appName变量中即可使用,看起来很方便,然而,@Value并不完美。

三、@Value的局限性

随着项目的扩展,会发现配置项散落在各个类中,导致配置信息碎片化,难以集中管理。
比如,可能会有成百上千个这样的注解分布在不同的类中,这样的维护工作难度很大。例如:

@Value("${db.username}")
private String dbUsername;

@Value("${db.password}")
private String dbPassword;

@Value("${db.url}")
private String dbUrl;

如果需要修改数据库配置,那得在多个地方进行修改,这无疑增加出错的风险。

四、推荐方案:@ConfigurationProperties

为应对这些问题,Spring Boot提供了@ConfigurationProperties注解,可以将配置集中管理,并且更加清晰和可维护。
首先,定义一个配置类:

@ConfigurationProperties(prefix = "db")
public class DatabaseProperties {

    private String username;
    private String password;
    private String url;

    // getters and setters
}

接着,需要在Spring Boot应用中启用这个配置类:即在启动类加入注解

@SpringBootApplication
@EnableConfigurationProperties(DatabaseProperties.class)
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

这样,就可以通过注入DatabaseProperties类来使用这些配置:

@Service
public class DatabaseService {

    private final DatabaseProperties databaseProperties;

    public DatabaseService(DatabaseProperties databaseProperties) {
        this.databaseProperties = databaseProperties;
    }

    public void printDatabaseConfig() {
        System.out.println("URL: " + databaseProperties.getUrl());
        System.out.println("Username: " + databaseProperties.getUsername());
    }
}

通过@ConfigurationProperties,可以将相关的配置集中在一个类中,这样不仅可以简化配置管理,还可以提高代码的可维护性。
所有与数据库相关的配置都集中在DatabaseProperties类中,修改起来也更方便。

五、配置校验

在实际开发中,配置的校验很重要,Spring Boot提供了spring-boot-starter-validation模块,可以通过@Validated注解实现配置校验。例如:

@ConfigurationProperties(prefix = "db")
@Validated
public class DatabaseProperties {

    @NotNull
    private String username;

    @NotNull
    private String password;

    @NotNull
    @URL
    private String url;

    // getters and setters
}

通过这种方式,可以在应用启动时就校验配置是否正确,避免了运行时才发现配置错误的问题。

六、完整案例

用实际项目中的完整案例,来更好地理解@Value迁移到@ConfigurationProperties的过程。

假设:一个完整项目包含多个微服务,每个服务都有自己独立的配置文件。最初使用@Value注解来读取配置,但是随着项目的扩展,配置项越来越多,导致维护起来非常困难。
因此,决定将@Value注解迁移到@ConfigurationProperties。

1.迁移前的代码

配置文件 application.properties:

db.username=root
db.password=secret
db.url=jdbc:mysql://localhost:3306/mydb

服务类 DatabaseService:

@Service
public class DatabaseService {

    @Value("${db.username}")
    private String username;

    @Value("${db.password}")
    private String password;

    @Value("${db.url}")
    private String url;

    public void printDatabaseConfig() {
        System.out.println("URL: " + url);
        System.out.println("Username: " + username);
    }
}
2.迁移步骤

创建配置类
首先,创建一个用于存储数据库配置的类,并使用@ConfigurationProperties注解。

@ConfigurationProperties(prefix = "db")
public class DatabaseProperties {

    private String username;
    private String password;
    private String url;

    // getters and setters
}

启用配置类

然后,需要在Spring Boot应用中启用这个配置类。在主类中添加@EnableConfigurationProperties注解。

@SpringBootApplication
@EnableConfigurationProperties(DatabaseProperties.class)
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

修改服务类

接下来,修改DatabaseService类,使用DatabaseProperties类来注入配置。

@Service
public class DatabaseService {

    private final DatabaseProperties databaseProperties;

    public DatabaseService(DatabaseProperties databaseProperties) {
        this.databaseProperties = databaseProperties;
    }

    public void printDatabaseConfig() {
        System.out.println("URL: " + databaseProperties.getUrl());
        System.out.println("Username: " + databaseProperties.getUsername());
    }
}

添加配置校验
为确保配置的正确性,可以在DatabaseProperties类上添加校验注解。

@ConfigurationProperties(prefix = "db")
@Validated
public class DatabaseProperties {

    @NotNull
    private String username;

    @NotNull
    private String password;

    @NotNull
    @URL
    private String url;

    // getters and setters
}
七、挑战点

在迁移过程中,可能会遇到一些挑战,比如:

重构现有代码:需要花费一定时间将所有@Value注解替换为@ConfigurationProperties。

配置校验:添加校验逻辑后,必须确保所有配置项都满足要求,否则应用无法启动。

团队协作:迁移过程中,需要团队成员共同参与,确保所有服务都同步迁移。

总的来说,@ConfigurationProperties相对于@Value具有明显的优势,它可以简化配置管理,集中配置信息,并且通过配置校验提高应用的可靠性。


原文地址:https://blog.csdn.net/qq_40623672/article/details/139864912

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!