如何在Spring Boot中使用属性启动应用程序时动态创建bean

时间:2019-05-07 13:54:55

标签: spring-boot

我使用多个数据库来存储不同的实体。我的实体和存储库分为不同的包。对于每个数据库,我需要创建@Configuration以正确保存数据并正确创建表。

这是我其中一个数据库的@Configuration文件

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "entityManagerFactory",
    basePackages = { "com.domain.shop.users.repositories" },
    transactionManagerRef = "transactionManager"
)
public class UsersDatabaseConfig {

@Autowired
private DatasourceConnectionManager dscm;

@Primary
@Bean(name = "dataSource1")
public DataSource dataSource() {
    return dscm.getDataSource("users");
}

@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean 
entityManagerFactory(EntityManagerFactoryBuilder builder, 
@Qualifier("dataSource1") DataSource dataSource1) {

    HashMap<String, Object> properties = new HashMap<>();
    properties.put("hibernate.hbm2ddl.auto", "update");

    return builder
            .dataSource(dataSource1)
            .packages("com.domain.shop.users.models")
            .properties(properties)
            .build();
}

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

效果很好!但是我需要为每个数据库创建单独的类 我想在应用程序开始读取属性.yml文件时创建此类bean。 并查看顶部的注释-如何将一些参数传递给注释?

换句话说,我有带有数据库连接属性的.yml文件。我想向每个数据库添加一些属性(例如,rootdirectory = com.domain.shop.products)。之后,我想使用以下代码创建动态bean:

 @Configuration
 @EnableTransactionManagement
 @EnableJpaRepositories(
    entityManagerFactoryRef = "productsEntityManagerFactory",
    basePackages = { "com.domain.shop.products.repositories" },
    transactionManagerRef = "productsTransactionManager"
)

然后下一个

@Bean(name = "productsDataSource")
public DataSource dataSource() {
    return dscm.getDataSource("products");
}

2 个答案:

答案 0 :(得分:0)

您可以使用@Profile批注。然后为每个配置文件创建属性文件。例如

@Profile("test") @Profile("dev") application-test.yml application-dev.yml

答案 1 :(得分:0)

如果表达式验证为true,则使用@ConditionalOnExpression将加载`@Configuration类

@ConditionalExpression("${my.rest.controller.enabled}")

{{3}}

@ConditionalOnProperty(prefix = "spring", name = "example.values")