如何使用属性设置注释值

How to set annotation values with properties

我想根据“配置文件”设置注释的值。

让我举个例子来解释;

@Entity
//PROD
@Table(name="users", schema="JDEPRD")
//DEV
//@Table(name="users", schema="JDEDEV")

在上面的例子中我们可以看到活动的“配置文件”是PROD,但是假设我们想使用DEV配置文件,我们将不得不注释来自PROD的@Table注释并取消注释DEV @Table 注释.

如果那只是一个实体,那不会有问题,但我有很多实体都遇到这种情况,所以我认为这不是处理这种即兴“配置文件”的方法.

不知道有什么办法可以解决这种情况吗?

我不会在 table 中包含模式信息,我会用 application.properties 控制它,具有多个 profile-based 属性。

spring.datasource.url=jdbc:postgresql://localhost:5432/schema-dev

正在提供您的活动配置文件运行时-Dspring.active.profile=dev

您可以使用 https://www.baeldung.com/spring-profiles#3-multi-document-files 甚至多个文件。

my.prop=used-always-in-all-profiles
#---
spring.config.activate.on-profile=dev
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=root
spring.datasource.password=root
#---
spring.config.activate.on-profile=production
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

注释是一个 compile-time 概念,属性是一个 build-time 或运行时概念。如果以这种方式配置注释,则注释是 class 文件的一部分,因此无法在运行时更改它们。

但也许你可以用像 cglib 这样的库来改变它。但是:正如 Raghu Dinka 所说,使用两个不同的数据库或方案要好得多。一个用于开发,一个用于生产。并且必须在 OR-Mapper 分析 classes.

之前完成此操作

另一种方法是为 java 编译器实现一个编译器插件来更改 table 定义。但这也不是一个好的风格。