配置Java EE应用程序或“将Bien付诸实践”

过去,有关应用程序配置的讨论很多。 我不知道谁拉开了辩论的序幕,但是最基础的阅读(着眼于未来的Java EE 7及更高版本)是Antonio Goncalves的帖子[辩论] – Java EE 7中的配置如何 ? 事实是,使用香草Java EE,我们每天都在进行应用程序配置。 没有适当的机制。 看完亚当昨天的最新文章后,我想对它做些补充,我觉得它可以适合大多数项目。

为什么发布这个帖子?

亚当展示的基本知识非常聪明。 你只是

@Inject
int yourConfigVariable;

到此为止。 您不必关心属性或其他配置类。 但是查看它,您发现您需要以某种方式从某个地方填充您的配置。 回顾安东尼奥的帖子,您会发现您有很多选择。 我们最满意的一种可能是Java的Properties机制。 结合使用此代码和Adam提供的代码,您最终将获得Configuration.properties,其中包含无数个单词键列表。 那不是我所说的可维护的。 因此,基本上,这就是该帖子为何拥有标题的原因:“将Bien付诸实践” ..oO(对不起,亚当!):-)这是我解决该问题的方法。

从属性文件填充您的配置

最基本的部分是将Configuration.properties文件添加到您的应用程序(默认程序包)。 现在,我们将对配置持有人进行一些修改,使其成为属性类型。 现在,修改Adam的fetchConfiguration()方法以加载它。

private Properties configData;@PostConstructpublic void fetchConfiguration() {String fileName = "Configuration.properties";configData =loadPropertiesFromClasspath(fileName);
}/*** Load properties file from classpath with Java 7 :-)* @param fileName* @return properties*/public static Properties loadPropertiesFromClasspath(String fileName) {try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)) {if (in != null) {props = new Properties();props.load(in);}} catch (IOException ioe) {log.debug("Can't load properties.", ioe);}

现在,您必须相应地修改@Producer方法。 我只在这里显示getString()方法向您展示概念:

/*** Get a String property* @param point* @return String*/
@Produces
public String getString(InjectionPoint point) {String propertyPath = point.getMember().getDeclaringClass().getName()+ ".";String propertyName = point.getMember().getName();String propertyValue = configData.getProperty(propertyPath+propertyName);return (propertyValue == null) ? "" : propertyValue;}

为了方便起见,我将声明类的名称添加为propertyPath,以便使属性文件中的顺序更加明确。 如Adam所示,使用生产者方法:

package net.eisele.configuration;
public class HitsFlushTimer {@Injectprivate String hitsFlushRate;}

在这种情况下,您最终使用Configuration.properties文件中的键net.eisele.configuration.HitsFlushTimer.hitsFlushRate访问属性。 快速警告。 如果您遇到这种情况,则必须在耳朵内打包单独的ejb和war模块,您可能需要在Configuration单例中使用javax.annotation.security.PermitAll注释。

然后您会得到很多重复

可能是真的。 如果重新配置相同的配置(例如,httpProxy),这将强制您为属性文件中的不同键使用相同的值。 解决方案似乎很简单。 为此,我们需要自己的资格赛。 我们走吧:

@Retention(RUNTIME)
@Target({FIELD, METHOD})
@Qualifier
public @interface AppProperty {@Nonbindingpublic String value();
}

现在我们有自己的资格赛。 接下来是相应地更改@Producer:

@Produces @AppProperty("")public String getString(InjectionPoint point) {String property = point.getAnnotated().getAnnotation(AppProperty.class).value();String valueForFieldName = configData.getProperty(property);return (valueForFieldName == null) ? "" : valueForFieldName;
}

而已。 现在,您可以在任何地方使用类似的内容:

@Inject@AppProperty("net.eisele.configuration.test2")String test2;

我知道,这还不如亚当的@Inject注解那么优雅。 但是:您不必花很多时间就可以看到正在发生的事情以及您的价值来自何处。 我认为这是一个有多个开发人员的项目中的专业人士。

是的 仍然不是很可维护。

好。 我知道。 您仍在谈论重构属性名称。 对? 还剩下什么呢? 您可以考虑使用封装了所有属性键的CKey枚举,并使用它而不是简单地使用键本身。 但是,我宁愿在代码中简单地使用普通的String键。 现在配置愉快。 您如何配置应用程序? 让我知道! 很高兴收到评论:)

参考: 配置Java EE应用程序,或从JCG合作伙伴 Markus Eisele的“将Bien付诸实践” (位于使用Java的企业软件开发中) 。

相关文章 :

  • 从Spring到Java EE 6
  • Java EE中的配置管理
  • Java EE过去,现在和云7
  • Java EE6事件:JMS的轻量级替代品
  • Java EE6装饰器:在注入时装饰类

翻译自: https://www.javacodegeeks.com/2011/12/configure-java-ee-applications-or.html

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

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

相关文章

HTML5 Canvas入门

HTML5的canvas&#xff08;画布&#xff09;元素使用JavaScript在网页上绘制图像。下面以一个简单例子及其效果图&#xff08;图1&#xff09;开始&#xff1a; <!DOCTYPE HTML> <html><head><style type"text/css"> canvas{border:dashed 2…

NYOJ 27 大数阶乘

大数阶乘 时间限制&#xff1a;3000ms | 内存限制&#xff1a;65535KB难度&#xff1a;3描述我们都知道如何计算一个数的阶乘&#xff0c;可是&#xff0c;如果这个数很大呢&#xff0c;我们该如何去计算它并输出它&#xff1f; 输入输入一个整数m(0<m<5000)输出输出m的…

泄漏:Oracle WebLogic Server 12g

JavaOne已经比我们落后了将近一个星期&#xff0c;我仍在撰写有关它的详细博客文章 。 我真的很惊讶的事实是&#xff0c;我没有看到任何提及我最喜欢的应用程序服务器更新的事实。 是的&#xff0c;我喜欢WebLogic产品。 从一开始。 自从收购BEA以来&#xff0c;甲骨文一直对我…

画家问题

【题目描述】 有一个正方形的墙&#xff0c;由N*N个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时&#xff0c;位置(i-1,j)、(i1,j)、(…

8-IO总结

3、 4、 5、 转载于:https://www.cnblogs.com/fubaizhaizhuren/p/5026207.html

NYOJ 36 最长公共子序列

最长公共子序列 时间限制&#xff1a;3000ms | 内存限制&#xff1a;65535KB难度&#xff1a;3描述咱们就不拐弯抹角了&#xff0c;如题&#xff0c;需要你做的就是写一个程序&#xff0c;得出最长公共子序列。tip&#xff1a;最长公共子序列也称作最长公共子串(不要求连续)&…

python 发邮件_python发邮件

smtplibPython提供smtplib模块&#xff0c;该模块定义了一个SMTP客户端会话对象&#xff0c;可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。这是一个简单的语法&#xff0c;用来创建一个SMTP对象&#xff0c;稍后将演示如何用它来发送电子邮件 import smtplib…

Java SE 7、8、9 –推进Java

今天&#xff08;注&#xff1a;2011年10月4日&#xff09;是主题演讲日。 JavaOne Keynote将于今早从上午8:30到10:30进行&#xff0c;而我的新闻通行证又一次让我很早就开始了。 因此&#xff0c;我有时间在所有关键球员准备就绪并可能感到紧张的同时为其拍摄一些非常个性化的…

Ferguson游戏

考虑一个简单的游戏&#xff1a; 有两个盒子&#xff0c;其中一个装有m颗糖、另一个装有n颗糖&#xff0c;将这样的状态记为(m,n)。每次的移动是将其中一个盒子清空&#xff0c;把另一个盒子的一些糖拿到被清空的盒子里使得两个盒子至少各有一颗糖。两个操作者轮流进行操作&…

undefined和NUll的区别

Undefined类型只有一个值 即特殊的undefined 在使用var声明变量但未对其加以初始化时 这个变量的值就是undefined var messagealert(message undefined); //true此例子声明message 但未对其进行初始化&#xff0c;比较这个变量的自变量与undefined字面量 结果表明他们是相等的…

NYOJ 106 背包问题

背包问题 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述现在有很多物品&#xff08;它们是可以分割的&#xff09;&#xff0c;我们知道它们每个物品的单位重量的价值v和重量w&#xff08;1<v,w<10&#xff09;&#xff1b;如果给…

python数据挖掘与机器学习实战_Python数据挖掘与机器学习技术入门实战(1)

什么是数据挖掘?数据挖掘指的是对现有的一些数据进行相应的处理和分析&#xff0c;最终得到数据与数据之间深层次关系的一种技术。例如在对超市货品进行摆放时&#xff0c;牛奶到底是和面包摆放在一起销量更高&#xff0c;还是和其他商品摆在一起销量更高。作者&#xff1a;韦…

使用Spring 3.1和基于Java的配置构建RESTful Web服务,第2部分

1.概述 本文介绍了如何在Spring中设置REST –控制器和HTTP响应代码&#xff0c;有效负载编组配置和内容协商。 2.在Spring了解REST Spring框架支持两种创建RESTful服务的方式&#xff1a; 与ModelAndView一起使用MVC 使用HTTP消息转换器 ModelAndView方法较旧&#xff0c;文…

Vmware Player 比较

VMware Workstation 12 Player 与 VMware Player 7 Pro 比较 主要功能特性VMware Player 7 ProVMware Workstation 12 Player针对商业用途授予许可是是支持多达 16 个虚拟 CPU、8 TB 磁盘、64 GB RAM 和 2 GB 显存是是支持 Microsoft Windows 10、Ubuntu 15.04、RHEL 7.1、Fedo…

(转)求单链表是否有环,环入口和环长

转自&#xff1a;http://www.cnblogs.com/youxin/p/3303172.html 1.链表中是否有环的判断可以设置两个指针(fast,slow)&#xff0c;初始值均指向头&#xff0c;slow每次向前一步&#xff0c;fast每次向前两步&#xff1b;如果链表中有环&#xff0c;则fast先进入环中&#xff0…

OJ RuntimeError常见原因

RuntimeError常见出错的原因可能有以下几种&#xff1a; 1、数组开得太小了&#xff0c;导致访问到了不该访问的内存区域 2、发生除零错误 3、大数组定义在函数内,导致程序栈区耗尽 4、指针用错了&#xff0c;导致访问到不该访问的内存区域 5、还有可能是程序抛出了未接收…

python recv_Python socket.recv方法代码示例

# 需要导入模块: from gevent import socket [as 别名]# 或者: from gevent.socket import recv [as 别名]def handle(self):"""The main request handling method, called by the server.This method runs a request handling loop, calling:meth:handle_one_r…

使用Selenium或WebDriver测试GWT应用

对于Web应用程序开发人员及其团队而言&#xff0c;良好的功能测试是最困难的任务之一。 开发价格低廉且维护良好的测试是一项挑战&#xff0c;这有助于降低质量检查成本并提高质量。 Selenium和WebDriver&#xff08;本质上现在是Selenium的继承者&#xff09;都提供了一种无需…

MySQL中有关TIMESTAMP和DATETIME的总结

一、MySQL中如何表示当前时间&#xff1f; 其实&#xff0c;表达方式还是蛮多的&#xff0c;汇总如下&#xff1a; CURRENT_TIMESTAMP CURRENT_TIMESTAMP() NOW() LOCALTIME LOCALTIME() LOCALTIMESTAMP LOCALTIMESTAMP() 二、关于TIMESTAMP和DATETIME的比较 一个完整的日期格式…

NYOJ 202 红黑树

红黑树 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述 什么是红黑树呢&#xff1f;顾名思义&#xff0c;跟枣树类似&#xff0c;红黑树是一种叶子是黑色果子是红色的树。。。 当然&#xff0c;这个是我说的。。。 《算法导论》上可不是这么…