使用CDI的InjectionPoint注入配置值

依赖注入是用于组织类依赖的一项出色技术。 当前类中需要的所有类实例都是在运行时从DI容器提供的。 但是您的配置呢?

当然,您可以创建一个“ Configuration”类,并在需要它的任何地方注入该类,并从中获取必要的值。 但是CDI允许您使用InjectionPoint概念更细粒度地做到这一点。

如果编写@Produces方法,则可以让您的CDI容器也注入一些有关当前代码的信息,新创建/产生的值将注入到这些信息中。 可在此处找到可用方法的完整列表。 有趣的一点是,您可以查询此类以获取当前注入点具有的所有注释:

Annotated annotated = injectionPoint.getAnnotated();
ConfigurationValue annotation = annotated.getAnnotation(ConfigurationValue.class);

如上面的示例代码所示,我们可以引入一个简单的@Qualifier批注,该批注标记所有需要特定配置值的注入点。 在此博客文章中,我们只想使用字符串作为配置值,但是整个概念当然也可以扩展到其他数据类型。 已经提到的@Qualifier批注如下所示:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface ConfigurationValue {
	@Nonbinding ConfigurationKey key();
}

public enum ConfigurationKey {
	DefaultDirectory, Version, BuildTimestamp, Producer
}

注释当然具有保留策略RUNTIME,因为CDI容器必须在应用程序运行时对其进行评估。 它可以用于字段和方法。 除此之外,我们还创建了一个键属性,该属性由枚举ConfigurationKey支持。 在这里,我们可以介绍所需的所有配置值。 在我们的示例中,例如,这是默认目录,程序版本等的配置值。 我们将此属性标记为@Nonbinding,以防止CDI容器使用此属性的值来选择正确的生产者方法。 如果我们不使用@Nonbinding,则必须为枚举的每个值编写一个@Produces方法。 但是这里我们要用一种方法处理所有这些。

下面的代码示例显示了@Produces方法,用于使用@ConfigurationKey注释的字符串:

@Produces
@ConfigurationValue(key=ConfigurationKey.Producer)
public String produceConfigurationValue(InjectionPoint injectionPoint) {
	Annotated annotated = injectionPoint.getAnnotated();
	ConfigurationValue annotation = annotated.getAnnotation(ConfigurationValue.class);
	if (annotation != null) {
		ConfigurationKey key = annotation.key();
		if (key != null) {
			switch (key) {
				case DefaultDirectory:
					return System.getProperty("user.dir");
				case Version:
					return JB5n.createInstance(Configuration.class).version();
				case BuildTimestamp:
					return JB5n.createInstance(Configuration.class).timestamp();
			}
		}
	}
	throw new IllegalStateException("No key for injection point: " + injectionPoint);
}

@Produces方法获取作为参数注入的InjectionPoint,以便我们可以检查其值。 因为我们对注入点的注释感兴趣,所以我们看看当前注入点是否使用@ConfigurationValue进行注释。 如果是这种情况,我们看看@ConfigurationValue的key属性并确定我们返回哪个值。 而已。 当然,在更复杂的应用程序中,我们可以从某些文件或某种其他类型的数据存储中加载配置。 但是概念保持不变。

现在,我们可以轻松地使用以下两行代码来让CDI容器注入所需的配置值:

@Inject @ConfigurationValue(key = ConfigurationKey.DefaultDirectory)
    private String defaultDirectory;

结论 :在整个应用程序中访问一组配置值从未如此简单。


翻译自: https://www.javacodegeeks.com/2014/02/injecting-configuration-values-using-cdis-injectionpoint.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值