Spring Boot 常用应用属性

Posted

技术标签:

【中文标题】Spring Boot 常用应用属性【英文标题】:Spring boot common application properties 【发布时间】:2018-05-30 06:43:36 【问题描述】:

当我们使用像 cassandra/mongo 这样的任何数据库时,Spring Boot 应用程序属性需要遵循 https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html 的约定。如果我们想为 DB 设置声明自己的属性而不是 spring-boot 约定,那么设置 DB 需要执行哪些步骤?

【问题讨论】:

【参考方案1】:

您可以这样做:Spring boot - custom variables in Application.properties

或者您可以在 application.properties 文件中创建自己的属性,例如:

my.property.someDb.hostname=http://wherever.com然后在您的代码中引用它,例如:

@Value("$my.property.someDb.hostname")
private String someDbHostname;

更新 1:

如果您想使用自己的属性创建 MongoDb,您必须在 @Configuration 文件中定义正确的 Java Bean。对于 MongoDB,它可能如下所示:

@Configuration
public class MyMongoConfig extends AbstractMongoConfiguration 

  @Value("$my.property.someDb.hostname")
  private String someDbHostname;

  @Value("$my.property.someDb.myOwnPortDefinition")
  private int myOwnPortDefinition;

  @Value("$my.property.someDb.myDatabasename")
  private String myDatabasename;

  @Override
  protected String getDatabaseName() 
    return myDatabasename;
  

  @Override
  @Bean
  public Mongo mongo() throws Exception
    return new MongoClient(someDbHostname, myOwnPortDefinition );
  

  @Bean
  public MongoTemplate mongoTemplate() throws Exception
    return new MongoTemplate(mongo(), getDatabaseName());
      

【讨论】:

我不是在问如何在 spring-boot 应用程序中使用属性,我想知道当我使用自己的属性而不是该列表中的属性,以及我们应该如何处理它们。 那么请指定数据库和使用的驱动程序。您是否正在访问例如MongoDb 通过 Morphia/Spring Data/Plain mongo 驱动程序? 可以说它是带有 spring 数据的 mongo db。【参考方案2】:

这些是您在 Spring Boot 中获取 Jdbc、mongodb 等数据源所需的基本步骤

需要一个启用了事务管理的@Configuration 类 就可以了 读取数据源的环境属性,即数据源 网址、用户名、密码等 为数据源、会话工厂、事务管理器创建 bean 等 完成上述所有设置后,在您的 消费者初始化spring应用上下文

这里有一些在spring boot中连接mongodb数据源的sn-ps

DataSourceConfiguration.java

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "com.example.xyz")
public class DatabaseEntityConfiguration 

    public static final String DATABASE_ENTITY_DATA_SOURCE = "databaseDataSource";
    public static final String DATABASE_HIBERNATE_PROPERTIES = "databaseHibernateProperties";
    public static final String DATABASE_ENTITY_SESSION_FACTORY = "databaseSessionFactory";
    public static final String DATABASE_ENTITY_TRANSACTION_MANAGER = "databaseTransactionManager";
    public static final String DATABASE_ENTITY_DB_CONFIG_DAO = "dmdatabaseDbConfigDao";
    public static final String DATABASE_ENTITY_DB_CONFIG_SERVICE = "dmdatabaseDbConfigService";

    private static final String ENTITY_PACKAGE = "com.example.xyz.database.entity";

    @Autowired
    private org.springframework.core.env.Environment environment;

    @Bean(name = DATABASE_ENTITY_DATA_SOURCE)
    public DataSource databaseEntitydataSource() throws PropertyVetoException 

        // mongodb properties
        String driverClass = environment.getProperty("databaseEntity.mongodb.driverClassName");
        String mongodbUrl = environment.getProperty("databaseEntity.mongodb.dmdatabaseDataSource.url");
        String user = environment.getProperty("databaseEntity.mongodb.dmdatabaseDataSource.username");
        String password = environment.getProperty("databaseEntity.mongodb.dmdatabaseDataSource.password");

        Preconditions.checkArgument(StringUtils.isNotBlank(driverClass), "The property mongodb driverClass must not be null or blank");
        Preconditions.checkArgument(StringUtils.isNotBlank(mongodbUrl), "The property mongodb mongodbUrl must not be null or blank");
        Preconditions.checkArgument(StringUtils.isNotBlank(user), "The property mongodb user must not be null or blank");
        Preconditions.checkArgument(StringUtils.isNotBlank(password), "The property mongodb password must not be null or blank");

        dataSource.setDriverClass(driverClass);
        dataSource.setmongodbUrl(mongodbUrl);
        dataSource.setUser(user);
        dataSource.setPassword(password);

        return dataSource;
    

    @Bean(name = DATABASE_ENTITY_SESSION_FACTORY)
    public AnnotationSessionFactoryBean databaseEntitySessionFactory() throws PropertyVetoException 
        AnnotationSessionFactoryBean annotationSessionFactoryBean = new AnnotationSessionFactoryBean();
        annotationSessionFactoryBean.setDataSource(databaseEntitydataSource());
        annotationSessionFactoryBean.setPackagesToScan(ENTITY_PACKAGE);
        annotationSessionFactoryBean.setAnnotatedClasses(DBConfig.class);

        annotationSessionFactoryBean.setHibernateProperties(databaseEntityHibernateProperties());
        return annotationSessionFactoryBean;
    

    @Bean(name = DATABASE_ENTITY_TRANSACTION_MANAGER)
    public HibernateTransactionManager databaseEntityTransactionManager() throws PropertyVetoException 
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(databaseEntitySessionFactory().getObject());
        return transactionManager;
    

【讨论】:

以上是关于Spring Boot 常用应用属性的主要内容,如果未能解决你的问题,请参考以下文章

转-spring-boot常用配置属性

转-spring-boot常用配置属性

spring boot 配置属性 之 spring.profiles.include

spring-boot 单元测试获取应用程序属性

Spring Boot使用Maven工具自动重启SpringBoot项目 | 热部署

如何从 Spring Boot 应用程序属性加载 Spring config xml $ 值