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

时间:2013-07-23 07:04:49

标签: java spring properties dependency-injection cdi

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

在春天写一篇:

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

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

如何用CDI做到这一点?我试图找到答案,但我找不到任何等价物。但是,人们写道,你可以在应用程序服务器上使用CDI作为Spring的替代品,而且用例是非常基本的,所以肯定必须有一个简单的方法,不幸的是我找不到它。

1 个答案:

答案 0 :(得分:4)

CDI是关于Dependecy Injection和Context的规范,所以它没有开箱即用的配置。但它还提供了一种非常强大的扩展机制,允许第三方项目添加新的可移植功能(即适用于所有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> 

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

public class MyCustomPropertyFileConfig implements PropertyFileConfig
{
    @Override
    public String getPropertyFileName()
    {
        return "myconfig.properties";
    }
} 

之后你就可以注入这样的值了

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

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

    ...
 }

正如您在本示例中看到的Deltaspike文档中所示,您可以在String中注入值,也可以在Integer,Long,Float,Boolean字段中注入值。如果您需要更具体的东西,可以提供自己的类型。 可以找到Deltaspike配置文档here