将 Apache Cassandra 与 Spring 一起使用时,首要任务之一是使用 Spring IoC 容器创建对象。 您可以通过使用基于 Java 的 Bean 元数据或使用基于 XML 的 Bean 元数据来实现此目的。 以下各节将讨论这些内容。com.datastax.oss.driver.api.core.CqlSessionSpring中文文档

对于那些不熟悉如何使用基于 Java 的 Bean 元数据而不是基于 XML 的元数据来配置 Spring 容器的人,请参阅此处参考文档中的高级介绍以及此处的详细文档。
对于那些不熟悉如何使用基于 Java 的 Bean 元数据而不是基于 XML 的元数据来配置 Spring 容器的人,请参阅此处参考文档中的高级介绍以及此处的详细文档。

使用基于 Java 的元数据注册会话实例

以下示例说明如何使用基于 Java 的 Bean 元数据来注册 :com.datastax.oss.driver.api.core.CqlSessionSpring中文文档

例 1.使用基于 Java 的 Bean 元数据注册对象com.datastax.oss.driver.api.core.CqlSession
@Configuration
public class AppConfig {

	/*
	 * Use the standard Cassandra driver API to create a com.datastax.oss.driver.api.core.CqlSession instance.
	 */
	public @Bean CqlSession session() {
		return CqlSession.builder().withKeyspace("mykeyspace").build();
	}
}

此方法允许您使用您可能已经知道的标准 API。com.datastax.oss.driver.api.core.CqlSessionSpring中文文档

另一种方法是使用 Spring 的 . 与直接实例化实例相比,该方法还有一个额外的优势,即还为容器提供了一个实现,该实现将 Cassandra 异常转换为 Spring 可移植层次结构中的异常。 Spring 的 DAO 支持功能中描述了这种层次结构和用法。com.datastax.oss.driver.api.core.CqlSessionCqlSessionFactoryBeancom.datastax.oss.driver.api.core.CqlSessionFactoryBeanExceptionTranslatorDataAccessException@RepositorySpring中文文档

以下示例显示了基于 Java 的工厂类用法:Spring中文文档

例 2.使用 Spring 的 :CqlSessionFactoryBean
@Configuration
public class FactoryBeanAppConfig {

	/*
	 * Factory bean that creates the com.datastax.oss.driver.api.core.CqlSession instance
	 */
	@Bean
	public CqlSessionFactoryBean session() {

		CqlSessionFactoryBean session = new CqlSessionFactoryBean();
		session.setContactPoints("localhost");
		session.setKeyspaceName("mykeyspace");

		return session;
	}
}

使用对象映射和存储库支持需要 、 、 和 启用存储库支持。CassandraTemplateCassandraTemplateCassandraMappingContextCassandraConverterSpring中文文档

以下示例演示如何注册组件以配置对象映射和存储库支持:Spring中文文档

例 3.注册组件以配置对象映射和存储库支持
@Configuration
@EnableCassandraRepositories(basePackages = { "org.springframework.data.cassandra.example" })
public class CassandraConfig {

	@Bean
	public CqlSessionFactoryBean session() {

		CqlSessionFactoryBean session = new CqlSessionFactoryBean();
		session.setContactPoints("localhost");
		session.setKeyspaceName("mykeyspace");

		return session;
	}

	@Bean
	public SessionFactoryFactoryBean sessionFactory(CqlSession session, CassandraConverter converter) {

		SessionFactoryFactoryBean sessionFactory = new SessionFactoryFactoryBean();
		sessionFactory.setSession(session);
		sessionFactory.setConverter(converter);
		sessionFactory.setSchemaAction(SchemaAction.NONE);

		return sessionFactory;
	}

	@Bean
	public CassandraMappingContext mappingContext() {
		return new CassandraMappingContext();
	}

	@Bean
	public CassandraConverter converter(CqlSession cqlSession, CassandraMappingContext mappingContext) {

		MappingCassandraConverter cassandraConverter = new MappingCassandraConverter(mappingContext);
		cassandraConverter.setUserTypeResolver(new SimpleUserTypeResolver(cqlSession));

		return cassandraConverter;
	}

	@Bean
	public CassandraOperations cassandraTemplate(SessionFactory sessionFactory, CassandraConverter converter) {
		return new CassandraTemplate(sessionFactory, converter);
	}
}

创建注册 Spring Data for Apache Cassandra 组件的配置类可能是一项令人筋疲力尽的挑战,因此 Spring Data for Apache Cassandra 附带了一个预构建的配置支持类。 从 Spring Data for Apache Cassandra 使用的注册 Bean 扩展而来的类。 允许您提供各种配置选项,例如初始实体、默认查询选项、池选项、套接字选项等。 还支持基于初始实体(如果提供任何实体)生成架构。 扩展 from 要求您至少通过实现该方法提供键空间名称。 以下示例演示如何使用以下方法注册 Bean:AbstractCassandraConfigurationAbstractCassandraConfigurationAbstractCassandraConfigurationAbstractCassandraConfigurationgetKeyspaceNameAbstractCassandraConfigurationSpring中文文档

例 4.使用 Apache Cassandra Bean 注册 Spring DataAbstractCassandraConfiguration
@Configuration
public class CassandraConfiguration extends AbstractCassandraConfiguration {

	/*
	 * Provide a contact point to the configuration.
	 */
	@Override
	public String getContactPoints() {
		return "localhost";
	}

	/*
	 * Provide a keyspace name to the configuration.
	 */
	@Override
	public String getKeyspaceName() {
		return "mykeyspace";
	}
}

Abstract…Configuration类从应用程序连接使用 Cassandra 所需的所有 bean。 该配置假定一个单组件,并将其连接到相关组件,例如 。 如果要自定义 的创建,则可以提供自定义函数。 这对于提供 Astra 的云连接包很有用。CqlSessionSessionFactoryCqlTemplateCqlSessionSessionBuilderConfigurerCqlSessionBuilderSpring中文文档

例 5.通过以下方式连接到 AstraAbstractCassandraConfiguration
@Configuration
public class CustomizedCassandraConfiguration extends AbstractCassandraConfiguration {

	/*
	 * Customize the CqlSession through CqlSessionBuilder.
	 */
	@Override
	protected SessionBuilderConfigurer getSessionBuilderConfigurer() {

		Path connectBundlePath = …;

		return builder -> builder
				.withCloudSecureConnectBundle(Path.of(connectBundlePath));
	}

	/*
	 * Provide a keyspace name to the configuration.
	 */
	@Override
	public String getKeyspaceName() {
		return "mykeyspace";
	}

}

XML 配置

本节介绍如何使用 XML 配置 Spring Data Cassandra。Spring中文文档

虽然我们仍然支持命名空间配置,但我们通常建议使用基于 Java 的配置

外部化连接属性

若要外部化连接属性,应首先创建一个属性文件,其中包含连接到 Cassandra 所需的信息。 并且是必填字段。contactpointskeyspaceSpring中文文档

以下示例显示了我们的属性文件,名为:cassandra.propertiesSpring中文文档

cassandra.contactpoints=10.1.55.80:9042,10.1.55.81:9042
cassandra.keyspace=showcase

在接下来的两个示例中,我们使用 Spring 将这些属性加载到 Spring 上下文中。Spring中文文档

使用基于 XML 的元数据注册会话实例

虽然您可以使用 Spring 的传统 XML 命名空间向容器注册 的实例,但 XML 可能非常冗长,因为它是通用的。 XML 命名空间是配置常用对象(如实例)的更好替代方法。 命名空间允许您创建实例。<beans/>com.datastax.oss.driver.api.core.CqlSessionCqlSessioncassandraCqlSessionSpring中文文档

以下示例演示如何配置命名空间:cassandraSpring中文文档

例 6.使用命名空间配置 Cassandra 的 XML 架构cassandra
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:cassandra="http://www.springframework.org/schema/data/cassandra"
  xsi:schemaLocation="
    http://www.springframework.org/schema/data/cassandra
    https://www.springframework.org/schema/data/cassandra/spring-cassandra.xsd
    http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd">

  <!-- Default bean name is 'cassandraSession' -->
  <cassandra:session contact-points="localhost" port="9042">
    <cassandra:keyspace action="CREATE_DROP" name="mykeyspace" />
  </cassandra:session>

  <cassandra:session-factory>
    <cassandra:script
            location="classpath:/org/springframework/data/cassandra/config/schema.cql"/>
  </cassandra:session-factory>
</beans>

下面显示了更高级的 Cassandra 配置的 XML 配置元素。 这些元素都使用默认的 Bean 名称来保持配置代码的整洁和可读性。Spring中文文档

虽然前面的示例显示了配置 Spring 以连接到 Cassandra 是多么容易,但还有许多其他选项。 基本上,DataStax Java 驱动程序提供的任何选项在 Spring Data for Apache Cassandra 配置中也可用。 这包括但不限于身份验证、负载平衡策略、重试策略和池选项。 所有 Spring Data for Apache Cassandra 方法名称和 XML 元素的命名都与驱动程序上的配置选项完全相同(或尽可能接近),因此映射任何现有驱动程序配置都应该是直接的。 以下示例演示如何使用 XML 配置 Spring Data 组件Spring中文文档

例 7.使用 XML 配置 Spring Data 组件
<!-- Loads the properties into the Spring Context and uses them to fill
in placeholders in the bean definitions -->
<context:property-placeholder location="classpath:cassandra.properties" />

<!-- REQUIRED: The Cassandra Session -->
<cassandra:session contact-points="${cassandra.contactpoints}" keyspace-name="${cassandra.keyspace}" />

<!-- REQUIRED: The default Cassandra mapping context used by `CassandraConverter` -->
<cassandra:mapping>
  <cassandra:user-type-resolver keyspace-name="${cassandra.keyspace}" />
</cassandra:mapping>

<!-- REQUIRED: The default Cassandra converter used by `CassandraTemplate` -->
<cassandra:converter />

<!-- REQUIRED: The Cassandra template is the foundation of all Spring
Data Cassandra -->
<cassandra:template id="cassandraTemplate" />

<!-- OPTIONAL: If you use Spring Data for Apache Cassandra repositories, add
your base packages to scan here -->
<cassandra:repositories base-package="org.spring.cassandra.example.repo" />
虽然我们仍然支持命名空间配置,但我们通常建议使用基于 Java 的配置