CDI Integration
存储库接口的实例通常由容器创建,在使用 Spring Data 时,Spring 容器会是最自然的选择。用于 Apache Cassandra 的 Spring Data 带有自定义 CDI 扩展,允许在 CDI 环境中使用存储库抽象。该扩展属于 JAR 的一部分。要激活它,请将用于 Apache Cassandra 的 Spring Data JAR 放入类路径中。现在,您可以通过实现 CassandraTemplate
的 CDI 生产者来设置基础架构,如下面的示例所示:
/*
* 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 存储库实例只是声明一个注入属性的问题,如下所示:
/*
* 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> {}