婚恋网站排名前三,ui网页设计成都培训,WordPress上传文件格式,河北邢台做wap网站依赖注入是用于组织类依赖的一项出色技术。 当前类中需要的所有类实例都是在运行时从DI容器提供的。 但是您的配置呢#xff1f; 当然#xff0c;您可以创建一个“ Configuration”类#xff0c;并在需要它的任何地方注入该类#xff0c;并从中获取必要的值。 但是CDI允许… 依赖注入是用于组织类依赖的一项出色技术。 当前类中需要的所有类实例都是在运行时从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(keyConfigurationKey.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; 结论 在整个应用程序中访问一组配置值从未如此简单。 参考在Martins Developer World博客上 使用我们的JCG合作伙伴 Martin Mois 使用CDI的InjectionPoint注入配置值 。 翻译自: https://www.javacodegeeks.com/2014/02/injecting-configuration-values-using-cdis-injectionpoint.html