跳到主要内容

CDI 集成

DeepSeek V3 中英对照 CDI Integration

通常,仓库接口的实例由容器创建,而在使用 Spring Data 时,Spring 是最自然的选择。Spring 提供了复杂的功能来创建 bean 实例。Spring Data Redis 附带了一个自定义的 CDI 扩展,允许你在 CDI 环境中使用仓库抽象。该扩展是 JAR 文件的一部分,因此要激活它,只需将 Spring Data Redis 的 JAR 文件放入你的类路径中即可。

然后,你可以通过为 RedisConnectionFactoryRedisOperations 实现一个 CDI Producer 来设置基础设施,如下例所示:

class RedisOperationsProducer {

@Produces
RedisConnectionFactory redisConnectionFactory() {

LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(new RedisStandaloneConfiguration());
connectionFactory.afterPropertiesSet();
connectionFactory.start();

return connectionFactory;
}

void disposeRedisConnectionFactory(@Disposes RedisConnectionFactory redisConnectionFactory) throws Exception {

if (redisConnectionFactory instanceof DisposableBean) {
((DisposableBean) redisConnectionFactory).destroy();
}
}

@Produces
@ApplicationScoped
RedisOperations<byte[], byte[]> redisOperationsProducer(RedisConnectionFactory redisConnectionFactory) {

RedisTemplate<byte[], byte[]> template = new RedisTemplate<byte[], byte[]>();
template.setConnectionFactory(redisConnectionFactory);
template.afterPropertiesSet();

return template;
}

}
java

必要的设置可能会有所不同,具体取决于你的 JavaEE 环境。

Spring Data Redis 的 CDI 扩展会提取所有可用的仓库作为 CDI bean,并在容器请求某个仓库类型的 bean 时,为该 Spring Data 仓库创建一个代理。因此,获取 Spring Data 仓库实例只需声明一个 @Injected 属性即可,如下例所示:

class RepositoryClient {

@Inject
PersonRepository repository;

public void businessMethod() {
List<Person> people = repository.findAll();
}
}
java

一个 Redis 仓库需要 RedisKeyValueAdapterRedisKeyValueTemplate 实例。如果没有提供这些 bean,Spring Data CDI 扩展会创建并管理这些 bean。然而,你也可以提供自己的 bean 来配置 RedisKeyValueAdapterRedisKeyValueTemplate 的具体属性。