CDI Integration
存储库接口的实例通常由容器创建,在使用 Spring Data 时,Spring 容器会是最自然的选择。用于 Apache Cassandra 的 Spring Data 带有自定义 CDI 扩展,允许在 CDI 环境中使用存储库抽象。该扩展属于 JAR 的一部分。要激活它,请将用于 Apache Cassandra 的 Spring Data JAR 放入类路径中。现在,您可以通过实现 CassandraTemplate
的 CDI 生产者来设置基础架构,如下面的示例所示:
Instances of the repository interfaces are usually created by a container, and the Spring container is the most natural choice when working with Spring Data.
Spring Data for Apache Cassandra ships with a custom CDI extension that allows using the repository abstraction in CDI environments.
The extension is part of the JAR.To activate it, drop the Spring Data for Apache Cassandra JAR into your classpath.
You can now set up the infrastructure by implementing a CDI Producer for the
CassandraTemplate
, as the following examlpe shows:
/*
* Copyright 2020-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.cassandra.example;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Disposes;
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Singleton;
import org.springframework.data.cassandra.core.CassandraAdminTemplate;
import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.cassandra.core.convert.MappingCassandraConverter;
import org.springframework.data.cassandra.core.mapping.CassandraMappingContext;
import org.springframework.data.cassandra.core.mapping.SimpleUserTypeResolver;
import com.datastax.oss.driver.api.core.CqlSession;
// tag::class[]
class CassandraTemplateProducer {
@Produces
@Singleton
public CqlSession createSession() {
return CqlSession.builder().withKeyspace("my-keyspace").build();
}
@Produces
@ApplicationScoped
public CassandraOperations createCassandraOperations(CqlSession session) {
CassandraMappingContext mappingContext = new CassandraMappingContext();
mappingContext.afterPropertiesSet();
MappingCassandraConverter cassandraConverter = new MappingCassandraConverter(mappingContext);
cassandraConverter.setUserTypeResolver(new SimpleUserTypeResolver(session));
cassandraConverter.afterPropertiesSet();
return new CassandraAdminTemplate(session, cassandraConverter);
}
public void close(@Disposes CqlSession session) {
session.close();
}
}
// end::class[]
用于 Apache Cassandra 的 Spring Data CDI 扩展会将 CassandraOperations
作为 CDI bean,并且在容器请求存储库类型 bean 时为 Spring Data 存储库创建代理。因此,获取 Spring Data 存储库实例只是声明一个注入属性的问题,如下所示:
The Spring Data for Apache Cassandra CDI extension picks up CassandraOperations
as a CDI bean and creates a proxy for a Spring Data repository whenever a bean of a repository type is requested by the container.
Thus, obtaining an instance of a Spring Data repository is a matter of declaring an injected property, as the following example shows:
/*
* Copyright 2020-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.cassandra.example;
import jakarta.inject.Inject;
import java.util.List;
import org.springframework.data.cassandra.repository.CassandraRepository;
// tag::class[]
class RepositoryClient {
@Inject PersonRepository repository;
public void businessMethod() {
List<Person> people = repository.findAll();
}
}
// end::class[]
interface PersonRepository extends CassandraRepository<Person, String> {}