【问题标题】:how can i parameterize datasource properties on Spring 4?如何在 Spring 4 上参数化数据源属性?
【发布时间】:2015-05-11 17:20:30
【问题描述】:

我使用的是 Spring 4.16。我想参数化我的持久性数据。这是我现在的配置:

@Configuration
@EnableTransactionManagement
public class PersistenceConfiguration {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
        entityManager.setDataSource(this.dataSource());
        entityManager.setPackagesToScan(new String[] {"com.example.movies.domain"});
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        entityManager.setJpaVendorAdapter(vendorAdapter);
        entityManager.setJpaProperties(this.properties());
        return entityManager;
    }

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/sarasa_db");
    dataSource.setUsername("root");
    dataSource.setPassword("mypassword");
    return dataSource;
}

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    private Properties properties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.setProperty("hibernate.show_sql", "false");
        return properties;
    }

}

我想在我的 application.properties 上参数化所有我能做的事情。首先,我想输入数据源属性(正如我在阅读的那样,spring 可能会自动构建我的数据源,但显然这只是使用 JdbcTemplate ......):

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/sarasa_db
spring.datasource.username=root
spring.datasource.password=mypassword

而且,如果可能的话,所有属性的属性,我在文档中找不到任何东西

你知道我该怎么做吗?


编辑

这是我的 DAO 实现

@Configuration
@Import(PersistenceConfiguration.class)
public class DAOConfiguration {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public ClientDAO clientDAO() {
        SimpleJpaRepository<Client, String> support = this.getSimpleJpaRepository(Client.class);
        return new MySQLClientDAO(support);
    }

    @Bean
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    @Description("Hibernate repository helper")
    protected <T> SimpleJpaRepository<T, String> getSimpleJpaRepository(Class<T> domainClass) {
        return new SimpleJpaRepository<T, String>(domainClass, this.entityManager);
    }

}

【问题讨论】:

  • 你在使用 Spring Boot 吗?

标签: java spring spring-mvc spring-data


【解决方案1】:

你可以这样做:

首先在 Spring 配置中的某处定义 PropertySourcesPlaceholderConfigurer bean:

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer ppc = new PropertySourcesPlaceholderConfigurer();
    ppc.setLocation(new ClassPathResource("application.properties"));
    return ppc;
}

此配置假定application.properties 文件位于类路径的根目录。

设置属性占位符配置器后,您可以像这样访问数据库配置类中的属性:

@Configuration
@EnableTransactionManagement
public class PersistenceConfiguration {

    @Value("${spring.datasource.url}")
    private String jdbcUrl;
    // ...

    @Bean
    public DataSource dataSource() {
       DriverManagerDataSource dataSource = new DriverManagerDataSource();
       dataSource.setUrl(jdbcUrl);
       // ...
    }
}

如果您想要一种简单的方法来参数化所有属性,您应该查看Spring Boot。它使用application.properties 文件自动创建具有这些属性和许多其他内容的数据源。这可能是您在问题中提到的自动数据源创建。

【讨论】:

  • 感谢您的回答。但是顺便说一下,如果我想添加一个属性,例如,我必须触摸配置。这就是为什么我想使用 application.context 自动执行此操作,因此 Spring 读取属性并使用所有附加属性创建我的数据源...
  • @user2601512 如果您希望 Spring 根据 application.properties 为您创建数据源和其他 bean,您可能希望使用 Spring Boot,正如我在回答末尾提到的那样:)
  • 哦,这正是我想要的。我的意思是我以前看过它,但我认为它只是为 Spring jbdc 准备的。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 2020-03-15
  • 2015-07-30
  • 2016-09-25
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多