使用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
使用CDI的InjectionPoint注入配置值相关推荐
- php cdi_使用CDI的InjectionPoint注入配置值
php cdi 依赖注入是用于组织类依赖的一项出色技术. 当前类中需要的所有类实例都是在运行时从DI容器提供的. 但是您的配置呢? 当然,您可以创建一个" Configuration&quo ...
- Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中
在spring工程中,我们经常需要使用到配置文件的一些信息,在每个类中定义,可能导致这些信息变得零散.spring给我们提供了一个注解@Value(),使我们可以注入配置文件中的数据. bootstr ...
- bean注入属性_摆脱困境:将属性值注入配置Bean
bean注入属性 Spring Framework对将从属性文件中找到的属性值注入到bean或@Configuration类中提供了很好的支持. 但是,如果将单个属性值注入这些类中,则会遇到一些问题. ...
- 摆脱困境:将属性值注入配置Bean
Spring Framework对将从属性文件中找到的属性值注入到bean或@Configuration类中提供了很好的支持. 但是,如果将单个属性值注入这些类中,则会遇到一些问题. 这篇博客文章指出 ...
- Istio1.12.1 Sidecar注入配置
1.istio-允许/禁用sidecar设置 1.1 在namespace设置自动注入: 给 zmc 命名空间设置标签:istio-injection=enabled: 1 2 3 4 5 6 7 ...
- springMVC通过spring.xml对属性注入bean值(工厂模式)
springMVC通过spring.xml对属性注入bean值,该bean是一个map容器: <bean id="configXMLCreatorFactory" class ...
- 晕了!这个配置值从哪来的?
如果有同事问你,数据库连接串的值和appsettings.json配的不一样,从哪来的?你能回答的出来吗? 配置读取顺序 ASP.NET Core 中的配置是使用一个或多个配置提供程序执行的,配置提供 ...
- @Value注解获取不到配置值
1. 写在前面 碰到过三种情况导致@Value获取不到配置值 变量被关键字static修饰 类没有使用@Component及其衍生标签修饰 在Bean初始化时构造方法中引用被@Value修饰的变量 如 ...
- Spring中@Value注解获取不到配置值
@Value注解必须要在spring的bean中才能使用,不能自己new一个对象调用 产生原因: 在SpringBoot中使用@Value只能给普通变量赋值,不能给静态变量赋值 解决方法: 给静态变量 ...
最新文章
- 车载网络处理器带来多功能能力
- FPGA之道(33)Verilog数据类型
- OpenGL Single Point单点移动三角形的实例
- 使用设计模式构建通用数据库访问类
- 读写自旋锁详解:TODO
- 操作系统ppt_华为车BU王军:华为三大汽车操作系统,及跨域集成软件框架(内含PPT)...
- php jquery ajax实现用户名,php+jquery+ajax实现用户名验证
- Python 廖雪峰Python练习答案
- java开发安卓app_开发安卓app常用的三种开发语言
- Modscan和Modsim 两种Modbus调试工具使用说明
- Jpg格式图片如何缩小?怎么把jpg格式图片变小?
- arduino遥控器控制灯开关以及亮度
- php 邮件上传类阿里云邮件上传接口
- 【FNN回归预测】基于matlab粒子群优化前馈神经网络婚姻和离婚数据回归预测【含Matlab源码 2069期】
- 身份管理的15个安全开发实践
- 怎么设置圆角html5,css怎么设置圆角?
- ubuntu18.04-ros-melodic-carlar安装教程详细指南
- android wms 窗口,Android6.0 WMS(十一) WMS窗口动画生成及播放
- ping 加上时间信息
- 在c语言中函数的隐函,C语言中的隐式函数声明
热门文章
- Spring XML中如何使用 符号,比如数据库MySQL连接
- 全局配置_配置全局异常处理,结果没有想到,spring boot实践(3)
- python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码
- aws lambda使用_使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存
- wxpay-api:pay_J2Pay – API响应
- 运动基元_Java更快地对基元数组进行排序?
- openwrt固定速率_固定速率与固定延迟– RxJava常见问题解答
- java jsf_将Java 8日期时间API与JSF和Java EE 7结合使用
- Java 14:记录
- 在AWS第1部分中使用Terraform自动缩放组:基本步骤