CDI 世界中@Value 的等价物是什么?

Web*_*vie 5 java spring dependency-injection properties cdi

将属性值从属性占位符注入 CDI bean 的方式是什么?

在春天写:

@org.springframework.beans.factory.annotation.Value("${webservice.user}")
private String webserviceUser;
Run Code Online (Sandbox Code Playgroud)

是什么将webserviceUser字段设置为webservice.user属性文件/属性占位符中的属性。

如何用 CDI 做到这一点?我试图找到一些答案,但我找不到任何等价物。但是,人们写道,您可以在应用程序服务器上使用 CDI 作为 Spring 替代品,并且该用例非常基础,因此肯定有一种简单的方法,不幸的是我没有找到它。

Ant*_*and 5

CDI 是一个关于依赖注入和上下文的规范,因此它没有开箱即用的配置。但它还提供了一个非常强大的扩展机制,允许第三方项目添加新的可移植功能(即与所有 CDI 实现一起工作并且不依赖于服务器)。提供 CDI 扩展的最重要的项目是Apache Deltaspike,好消息是,它提供了您所需要的东西。

所以你需要在你的项目中添加 deltaspike-core。如果您使用 Maven,则需要将此依赖项添加到 pom.xml

    <dependency>
        <groupId>org.apache.deltaspike.core</groupId>
        <artifactId>deltaspike-core-api</artifactId>
        <version>0.4</version>
    </dependency>

    <dependency>
        <groupId>org.apache.deltaspike.core</groupId>
        <artifactId>deltaspike-core-impl</artifactId>
        <version>0.4</version>
    </dependency> 
Run Code Online (Sandbox Code Playgroud)

之后,如果您不关心属性文件名,只需添加META-INF/apache-deltaspike.properties到您的项目并将属性放入其中即可。如果您需要多个文件或想要选择名称,则必须PropertyFileConfig为每个文件实现如下接口:

public class MyCustomPropertyFileConfig implements PropertyFileConfig
{
    @Override
    public String getPropertyFileName()
    {
        return "myconfig.properties";
    }
} 
Run Code Online (Sandbox Code Playgroud)

之后你就可以像这样注入值

@ApplicationScoped
public class SomeRandomService
{
    @Inject
    @ConfigProperty(name = "endpoint.poll.interval")
    private Integer pollInterval;

    @Inject
    @ConfigProperty(name = "endpoint.poll.servername")
    private String pollUrl;

    ...
 }
Run Code Online (Sandbox Code Playgroud)

正如您在取自 Deltaspike 文档的示例中看到的,您可以将值注入到字符串中,也可以注入到整数、长整型、浮点型、布尔型字段中。如果您需要更具体的内容,您可以提供自己的类型。可以在此处找到 Deltaspike 配置文档。