[英]Dynamic Bean configuration & loading in spring boot
我正在关注此链接以了解具有 spring 引导的六边形架构。 基础设施部分包含服务 bean 的配置,并且存储库作为参数作为以下方法传递。
配置
@Configuration
@ComponentScan(basePackageClasses = HexagonalApplication.class)
public class BeanConfiguration {
@Bean
BankAccountService bankAccountService(BankAccountRepository repository) {
return new BankAccountService(repository, repository);
}
}
我没有使用 JPA 而是使用 Spring JDBC 与 DB 交互。 链接教程使用 JPA。
可以说我有不同的数据库实现,即。 postgresql(BankAccountRepository) 和 db2(BankAccountDB2Rep)。 我想在不接触代码的情况下更改 bean。 像 yml 配置或者我可以单独维护而不是接触代码的东西。
BankAccountRepository.java
@Component
public class BankAccountRepository implements LoadAccountPort, SaveAccountPort {
private SpringDataBankAccountRepository repository;
// Constructor
@Override
public Optional<BankAccount> load(Long id) {
return repository.findById(id);
}
@Override
public void save(BankAccount bankAccount) {
repository.save(bankAccount);
}
}
如何在 spring 引导中实现相同的效果? 任何帮助表示赞赏..
您可以参考Spring 引导配置和使用两个数据源来创建多个数据源并执行以下操作。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager",
basePackages = {
"com.example"
}
)
public class JPAConfig {
@Primary
@Bean(name = "postgresDataSource")
@ConfigurationProperties(prefix = "postgres.datasource")
public DataSource postgresDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "db2DataSource")
@ConfigurationProperties(prefix = "db2.datasource")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("postgresDataSource") DataSource postgresdataSource,
@Qualifier("db2DataSource") DataSource db2dataSource,
@Value("${useDb2}") Boolean useDb2
) {
return builder
.dataSource(useDb2? db2dataSource : postgresdataSource)
.packages("com.example")
.persistenceUnit("db1")
.build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory
) {
return new JpaTransactionManager(entityManagerFactory);
}
}
正如@M.Deinum 在评论中提到的,这个问题可以通过使用spring 条件bean来解决,如下所示
@Configuration
@ConditionalOnProperty(
value="module.enabled",
havingValue = "true",
matchIfMissing = true)
class CrossCuttingConcernModule {
...
}
更多信息可以在这里找到
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.