当应用程序从不直接调用这些变量时,如何为通用的Spring Boot应用程序属性使用不同的变量名?

时间:2018-07-20 13:52:08

标签: java spring spring-boot configuration configuration-files

我已经使用ServicesRepositories创建了一个非常标准的 Spring Boot 2.0 应用程序来访问数据库。

我必须设置标准Spring Boot application properties才能使其正常工作,例如:

spring.datasource.url, spring.jpa.database, etc.

但是,为了防止从同一位置托管的类似应用程序中的覆盖其他属性,我需要重命名这些属性,例如:

myApp.spring.datasource.url, myApp.spring.jpa.database, etc.

其中一些属性将由环境变量而不是application.properties文件设置。

但是,我看不到任何方法可以在我的应用中覆盖这些变量。

标准方法是使用@Value配置那些变量。但是,用于服务的Spring Boot 2.0安装程序会在“幕后”查找所有这些属性,因此在这里似乎不是一个选择。

是否可以将我的应用配置为读取所有这些myApp.common.property.name属性并将它们视为common.property.name

谢谢。

1 个答案:

答案 0 :(得分:0)

是的,标准方法是使用@Value。但是工作并不仅限于此,您需要使用这些值创建DataSource和EntityManager。

Springboot将创建DataSource,Entitymanager和其他一些组件,但需要从文件中查找默认属性(spring.xxx)(因此,建议使用Spring boot)。但是,当您将这些名称更改为非默认值时,则需要自己创建这些组件/ bean。

除了使用@Value,您还可以使用@Configurationproperties@Value也可以,但是您可能需要使用@Value声明类似6或7个值。如果您希望使用@ConfigurationProperties,请确保在项目中的某处添加了@EnableConfigurationProperties注释。

这是一个代码段。您需要将其调整为您的项目

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactory",
  basePackages = { "com.xxx.yyy.repo" }
)
public class SomeDbConfig {

  @Primary // Use this if you have multiple datasources or else no use
  @Bean(name = "dataSource")
  @ConfigurationProperties(prefix = "myApp.spring.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

  @Primary
  @Bean(name = "entityManagerFactory")
  public LocalContainerEntityManagerFactoryBean 
  entityManagerFactory(
    EntityManagerFactoryBuilder builder,
    @Qualifier("dataSource") DataSource dataSource
  ) {
    return builder
      .dataSource(dataSource)
      .packages("com.xxx.yyy.domain")
      .persistenceUnit("somename")
      .build();
  }

  @Primary
  @Bean(name = "transactionManager")
  public PlatformTransactionManager transactionManager(
    @Qualifier("entityManagerFactory") EntityManagerFactory 
    entityManagerFactory
  ) {
    return new JpaTransactionManager(entityManagerFactory);
  }
}