使用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;

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LOJ.6435.[PKUSC2018]星际穿越(倍增)

LOJBZOJ 参考这儿qwq。 首先询问都是求,向左走的最短路。\(f[i][j]\)表示从\(i\)走到\(j\)最少需要多少步。表示这样只会\(O(n^2\log n)\)的 但是感觉能卡过\(70\)分。 注意到从\(i\)出发,走\(j\)步能到达的点都是一段一段的。所以不妨令\(f[i][j]\)表示…

java setsession_Java Session.setServerAliveInterval方法代码示例

import com.jcraft.jsch.Session; //导入方法依赖的package包/类private Session startNewSession(boolean acquireChannel) throws JSchException, InterruptedException {Session newSession null;final AtomicBoolean cancelled new AtomicBoolean(false);ConnectingProgr…

鼠标拖动改变DIV等网页元素的大小的最佳实践

1.初次实现 1.1 html代码 <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"en" lang"en"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>div change wid…

[WC2006]水管局长

水管局长 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P4172#sub LCT 显然两个点的路径上的边最大要最小在该图最小生成树上 正删倒加&#xff0c;倒着做变成加边操作 加边时判断一下是否能形成更优的生成树&#xff0c;用LCT删除和连接操作即可 1 #include<…

JDBC 4.0鲜为人知的Clob.free()和Blob.free()方法

在会议上谈论jOOQ时&#xff0c;我总是展示此幻灯片&#xff0c;其中包含许多人们经常犯的非常常见的JDBC错误&#xff1a; 此图中的六个常见的JDBC错误 您可以找到错误吗&#xff1f; 其中一些是显而易见的&#xff0c;例如&#xff1a; 第4行&#xff1a;由于第3行的连接…

反沙箱——SetErrorMode

目录 1.前言 2.原理讲解 3.代码实现 4.参考 1.前言 利用SetErrorMode进行反沙箱的技术&#xff0c;在2010年就有被提出&#xff0c;但是之前搜了很久都没有相关内容&#xff0c;这里简单的说一下这个反沙箱的实现。反沙箱参考GandCrab5.2。 2.原理讲解 首先讲一下SetErrorMode这…

bat java 启动脚本_从bat脚本运行的Java应用程序上的Windows关闭挂钩

小编典典在极少数情况下&#xff0c;虚拟机可能会中止&#xff0c;即在不完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况&#xff0c;例如在Unix上使用SIGKILL信号或在MicrosoftWindows上使用TerminateProcess调用。因此&#xff0c;不幸的是&#xff0c;我认为…

C89和C99区别--简单总结

&#xff08;1&#xff09;对数组的增强 可变长数组  C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.可变长数组的维数在数组生存期内是不变的,也就是说,可…

四、spring boot 1.5.4 日志管理

spring boot日志默认采用logback进行输出&#xff0c;你可以对logback进行定制化&#xff0c;方法如下&#xff1a; 在resources文件夹下建立logback.xml配置文件 <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- base.xml i…

使用MyBatis和Spring构建Java Web应用程序

这篇文章将展示如何在Spring环境中使用带有MyBatis框架的MYSQL DB创建学生注册应用程序。 这是一个简单的应用程序&#xff0c;旨在在注册期间从用户收集输入详细信息&#xff0c;将详细信息保存在MYSQL DB中&#xff0c;并在登录期间对它们进行身份验证。 1.使用Maven模板创建…

codeforces 1136E-Nastya Hasn't Written a Legend

传送门&#xff1a;QAQQAQ 题意&#xff1a;有一个数组a和一个数组k&#xff0c;数组a一直保持一个性质&#xff1a;a[i 1] > a[i] k[i]。有两种操作&#xff1a;1&#xff0c;给某个元素加上x&#xff0c;但是加上之后要保持数组a的性质。比如a[i]加上x之后&#xff0c;a…

java打印word_Java jacob调用打印机打印word文档

前面说了Java如何生成复杂的Word文档&#xff0c;今年记录下Java如何调用打印机打印word文档。起初用的是自带的PrintJob&#xff0c;但是系统提供的打印机制并不成熟完整。网上的代码也是千篇一律&#xff0c;在我的打印设备Canon iR2525/2530 UFRII LT上&#xff0c;我能获取…

将Spring MVC RESTful Web服务迁移到Spring 4

1引言 Spring 4为MVC应用程序带来了一些改进 。 在这篇文章中&#xff0c;我将重点介绍宁静的Web服务&#xff0c;并通过采用Spring 3.2实现的项目并将其升级到Spring 4来尝试这些改进。以下几点总结了本文的内容&#xff1a; 从Spring 3.2迁移到Spring 4.0 变化中的Response…

layui的富文本编辑器怎么赋值

除了上面讲的方法外&#xff0c;还可以使用layedit自带的方法赋值/*** 设置编辑器内容* param {[type]} index 编辑器索引* param {[type]} content 要设置的内容* param {[type]} flag 是否追加模式*/layedit.setContent(index, content, flag);flag是true&#xff0c;是追加模…

java scrollpane 设置透明_java swing 之 JScrollPane(滚动面板)的使用

/*** java swing 之JScrollPane面板* 在设置界面时&#xff0c;可能会遇到在一个较小的容器窗体中显示一个较大部分的内容&#xff0c;这时可以使用* JScrollPane面板&#xff0c;JscrollPane面板是带滚动条的面板&#xff0c;也是一种容器&#xff0c;但是常用于布置单个* 控件…

cefsharp重写默认js弹窗(alert/confirm/prompt)

1.设置js弹窗控制器 webView.JsDialogHandler this; //js弹窗控制 this表示本类对象&#xff0c;所以本类要实现IJsDialogHandler接口 2.实现IJsDialogHandler接口接口方法 public bool OnJSAlert(IWebBrowser browser, string url, string message){MessageBox.Show(messa…

休眠事实:如何“断言” SQL语句计数

介绍 Hibernate简化了CRUD操作&#xff0c;尤其是在处理实体图时。 但是任何抽象都有其代价&#xff0c;而Hibernate也不例外。 我已经讨论了获取策略和了解Criteria SQL查询的重要性&#xff0c;但是您可以做更多的事情来统治JPA。 这篇文章是关于控制Hibernate代表您调用的SQ…

软件工程(2019)第三次个人作业

目录 软件工程第三次作业问题描述分析并设计程序程序流程图选择覆盖标准并设计测试样例软件工程第三次作业 项目地址 问题描述 题目(1)&#xff1a;最大连续子数组和&#xff08;最大子段和&#xff09; 背景 问题&#xff1a; 给定n个整数&#xff08;可能为负数&#xff09;组…

Flutter - 创建侧滑菜单

侧滑菜单在安卓App里面非常常见&#xff0c;比如Gmail&#xff0c;Google Play&#xff0c;Twitter等。看下图 网上也有很多创建侧滑菜单的教程&#xff0c;我也来记录一下&#xff0c;自己学习创建Drawer的过程。 1. 创建一个空的App import package:flutter/material.dart;cl…

java框架白话_Java NIO框架Netty教程(二) 白话概念

"Hello World"的代码固然简单&#xff0c;不过其中的几个重要概念(类)和 Netty的工作原理还是需要简单明确一下&#xff0c;至少知道其是负责什。方便自己以后更灵活的使用和扩展。声明&#xff0c;笔者一介码农&#xff0c;不会那么多专业的词汇和缩写&#xff0c;只…