Spring Data Cassandra自定义CqlSession并自动加载application.yml配置
让自定义CqlSession自动加载Spring Boot配置的两种方法
为什么原代码无法自动加载配置
直接调用CqlSession.builder().build()是用Cassandra Driver的原生逻辑构建Session,完全没和Spring Boot的配置体系挂钩,自然读不到application.yml里的配置项。下面两种方案可以解决这个问题:
方案一:注入CassandraProperties复用配置
Spring Boot已经把spring.data.cassandra下的所有配置自动绑定到CassandraProperties类中,直接注入这个类就能获取所有配置,不用手动写一堆@Value:
@Configuration @EnableCassandraRepositories(basePackages = { "tacos" }) public class CassandraConfig { private final CassandraProperties cassandraProperties; // 构造注入Spring自动配置好的CassandraProperties public CassandraConfig(CassandraProperties cassandraProperties) { this.cassandraProperties = cassandraProperties; } @Bean CqlSession cassandraSession() { // 从CassandraProperties中读取配置,构建Session Builder CqlSessionBuilder builder = CqlSession.builder() .withKeyspace(cassandraProperties.getKeyspaceName()) .withLocalDatacenter(cassandraProperties.getLocalDatacenter()); // 如需其他配置(比如联系点、端口),也可以直接从cassandraProperties中获取 if (!cassandraProperties.getContactPoints().isEmpty()) { builder.addContactPoints(cassandraProperties.getContactPoints()); } if (cassandraProperties.getPort() != null) { builder.withPort(cassandraProperties.getPort()); } CqlSession delegate = builder.build(); return new MyCqlSession(delegate); } }
方案二:继承AbstractCassandraConfiguration(更推荐)
Spring Data Cassandra提供的AbstractCassandraConfiguration会自动读取application.yml的配置,帮你处理大部分Session初始化逻辑,只需重写对应方法添加自定义逻辑即可:
@Configuration @EnableCassandraRepositories(basePackages = { "tacos" }) public class CassandraConfig extends AbstractCassandraConfiguration { // 自动读取application.yml中的keyspace-name,无需手动指定 @Override protected String getKeyspaceName() { return super.getKeyspaceName(); } // 可在此方法中对已加载配置的Session Builder做额外自定义 @Override protected CqlSessionBuilder configureSessionBuilder(CqlSessionBuilder cqlSessionBuilder) { // 这里的cqlSessionBuilder已经自动加载了local-datacenter、contact-points等配置 return super.configureSessionBuilder(cqlSessionBuilder); } // 重写session方法,返回自定义的MyCqlSession @Override @Bean public CqlSession cassandraSession() throws Exception { CqlSession delegate = super.cassandraSession(); return new MyCqlSession(delegate); } }
内容的提问来源于stack exchange,提问作者Jane He
相关产品推荐
相关产品推荐

