依赖注入是用于组织类依赖的一项出色技术。 当前类中需要的所有类实例都是在运行时从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;

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

参考:在Martin's Developer World博客上, 使用我们的JCG合作伙伴 Martin Mois 使用CDI的InjectionPoint注入配置值 。

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

使用CDI的InjectionPoint注入配置值相关推荐

  1. php cdi_使用CDI的InjectionPoint注入配置值

    php cdi 依赖注入是用于组织类依赖的一项出色技术. 当前类中需要的所有类实例都是在运行时从DI容器提供的. 但是您的配置呢? 当然,您可以创建一个" Configuration&quo ...

  2. Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中

    在spring工程中,我们经常需要使用到配置文件的一些信息,在每个类中定义,可能导致这些信息变得零散.spring给我们提供了一个注解@Value(),使我们可以注入配置文件中的数据. bootstr ...

  3. bean注入属性_摆脱困境:将属性值注入配置Bean

    bean注入属性 Spring Framework对将从属性文件中找到的属性值注入到bean或@Configuration类中提供了很好的支持. 但是,如果将单个属性值注入这些类中,则会遇到一些问题. ...

  4. 摆脱困境:将属性值注入配置Bean

    Spring Framework对将从属性文件中找到的属性值注入到bean或@Configuration类中提供了很好的支持. 但是,如果将单个属性值注入这些类中,则会遇到一些问题. 这篇博客文章指出 ...

  5. Istio1.12.1 Sidecar注入配置

    1.istio-允许/禁用sidecar设置 1.1  在namespace设置自动注入: 给 zmc 命名空间设置标签:istio-injection=enabled: 1 2 3 4 5 6 7 ...

  6. springMVC通过spring.xml对属性注入bean值(工厂模式)

    springMVC通过spring.xml对属性注入bean值,该bean是一个map容器: <bean id="configXMLCreatorFactory" class ...

  7. 晕了!这个配置值从哪来的?

    如果有同事问你,数据库连接串的值和appsettings.json配的不一样,从哪来的?你能回答的出来吗? 配置读取顺序 ASP.NET Core 中的配置是使用一个或多个配置提供程序执行的,配置提供 ...

  8. @Value注解获取不到配置值

    1. 写在前面 碰到过三种情况导致@Value获取不到配置值 变量被关键字static修饰 类没有使用@Component及其衍生标签修饰 在Bean初始化时构造方法中引用被@Value修饰的变量 如 ...

  9. Spring中@Value注解获取不到配置值

    @Value注解必须要在spring的bean中才能使用,不能自己new一个对象调用 产生原因: 在SpringBoot中使用@Value只能给普通变量赋值,不能给静态变量赋值 解决方法: 给静态变量 ...

最新文章

  1. 车载网络处理器带来多功能能力
  2. FPGA之道(33)Verilog数据类型
  3. OpenGL Single Point单点移动三角形的实例
  4. 使用设计模式构建通用数据库访问类
  5. 读写自旋锁详解:TODO
  6. 操作系统ppt_华为车BU王军:华为三大汽车操作系统,及跨域集成软件框架(内含PPT)...
  7. php jquery ajax实现用户名,php+jquery+ajax实现用户名验证
  8. Python 廖雪峰Python练习答案
  9. java开发安卓app_开发安卓app常用的三种开发语言
  10. Modscan和Modsim 两种Modbus调试工具使用说明
  11. Jpg格式图片如何缩小?怎么把jpg格式图片变小?
  12. arduino遥控器控制灯开关以及亮度
  13. php 邮件上传类阿里云邮件上传接口
  14. 【FNN回归预测】基于matlab粒子群优化前馈神经网络婚姻和离婚数据回归预测【含Matlab源码 2069期】
  15. 身份管理的15个安全开发实践
  16. 怎么设置圆角html5,css怎么设置圆角?
  17. ubuntu18.04-ros-melodic-carlar安装教程详细指南
  18. android wms 窗口,Android6.0 WMS(十一) WMS窗口动画生成及播放
  19. ping 加上时间信息
  20. 在c语言中函数的隐函,C语言中的隐式函数声明

热门文章

  1. Spring XML中如何使用 符号,比如数据库MySQL连接
  2. 全局配置_配置全局异常处理,结果没有想到,spring boot实践(3)
  3. python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码
  4. aws lambda使用_使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存
  5. wxpay-api:pay_J2Pay – API响应
  6. 运动基元_Java更快地对基元数组进行排序?
  7. openwrt固定速率_固定速率与固定延迟– RxJava常见问题解答
  8. java jsf_将Java 8日期时间API与JSF和Java EE 7结合使用
  9. Java 14:记录
  10. 在AWS第1部分中使用Terraform自动缩放组:基本步骤