我已经使用Services
和Repositories
创建了一个非常标准的 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
?
谢谢。
答案 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);
}
}