将旧版本从Java EE 5减少到7

来自另一个时间的代码300x163 Java EE 5于2005年首次引入,而Java EE 7于2013年问世。这两个版本之间有7年的差距,从技术角度来说,这就像一个世纪。

许多组织仍然对使用Java EE 5感到困惑,并且有很多正当理由选择不升级。 不过,如果您考虑一些前进的理由,这些将变得无关紧要:

  • 受益于最新改进
  • 2013年第一季度的Java 6 EOL
  • 维护成本增加
  • 难以保持开发人员的兴趣

这些原因尚有争议,可能不足以说服某人升级。

在过去的几年中,我一直在开发具有相当大尺寸的应用程序,而最近它已从Java EE 5迁移到了7。

停止传统

码图

每年,都会引入新功能,以增加应用程序代码库。 它甚至超过了100万行代码! 仅凭这一事实就说明很难浏览如此庞大的代码库。 如果应用程序持续增长,随着时间的流逝只会变得更糟。 从开始应用到现在,我们可以观察到每年的增长一直稳定,直到2015年为止。 此后,代码仍在增长,但速度较慢。

怎么样?

实际上,通过更改为Java EE 7,可以产生相同的结果,但是只需编写更少的代码。 对于小型应用程序来说,这似乎不是什么大问题,但是当我们谈论一百万时,它就产生了巨大的变化。

通过花费更少的时间来实现相同的功能,您不仅可以提高工作效率,而且引入bug的机会也更少,这是因为您还可以减少混乱的代码。

没有人真的想更改旧代码,尤其是如果它正在运行,甚至更糟的话,您也不知道为什么要使用它。 但是Java EE 7(和6)有一些易于使用的功能,从Java EE 5迁移时可以立即使用。

CDI

记住在像Servlet这样的不同上下文中获取EJB的繁琐工作:

public static <T> T getLocalBean(final Class<T> klass) {try {LocalBinding localBinding = klass.getAnnotation(LocalBinding.class);if (localBinding == null) {throw new BeanNotFoundException(“…”);}return (T) initialContext.lookup(localBinding.jndiBinding());} catch (Exception e) {throw new BeanNotFoundException(“…”);}
}

其中大多数可以简单地用@Inject代替。

不再有本地接口

总是必须为您的Bean定义一个接口很麻烦,特别是如果它们仅在本地使用时:

@Stateless
@Local(UserBusiness.class)
public class UserBusinessBean implements UserBusiness {...
}

只需替换为:

@Stateless
public class UserBusinessBean {...
}

单身人士

老式的Singleton(也许不是最正确的方法):

public class ModuleListener {
    private static ModuleListener moduleListener;
    private static ModuleBusiness moduleBusiness;

    private ModuleListener() {
       moduleBusiness = BeanFactory.getLocalBean(ModuleBusinessBean.class);
    }

    public static ModuleListener getInstance() {
        if (moduleListener == null) {
            moduleListener = new ModuleListener();
        }
        return moduleListener;
    }
}

您只需将其更改为:

@Singleton

@Lock(LockType.READ)

public class ModuleListener {

    @EJB
    private ModuleBusiness moduleBusiness;
}

验证方式

由于Java EE 5中没有Bean验证可用,因此有时您不得不采取以下措施:

public static int fieldEntityMaxLenght(Class clazz, String field) throws Exception {
    int maxLength = 0;
    if (field != null) {
        Column annotation = clazz.getDeclaredField(field).getAnnotation(Column.class);
         maxLength = annotation.length();
    }
    return maxLength;

}public static void rejectIfMaxLengthExceeded(String field, int maxLength) {
    if (field != null && field.length() > maxLength) { … }
}

现在,我们可以在要验证的字段中使用@NotNull@Max批注。

JMS

在Java EE 5中使用JMS是一件痛苦的事情:

@Resource(mappedName = "java:/JmsXA")
private ConnectionFactory connectionFactory;
@Resource(mappedName = "java:/jms/queue/EmailQueue")
private Destination destination;public void sendAlertsByEmail(Map<Long, String> toSend, List<AlertAttachment> files) {try {Connection connection = connectionFactory.createConnection();Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);MessageProducer producer = session.createProducer(destination);HashMap<String, Alert> dataToSend = new HashMap<>();for (Long alertId : toSend.keySet()) {log.info(String.format("Sending alert %d to %s", alertId, toSend.get(alertId)));Alert alert = findAlert(alertId);alert.getAlertContent().setBodyMail(undecorateHTMLLinks(TemplateContextUtils.createMailMessage(alert, Configuration.getInstance())));dataToSend.put(toSend.get(alertId), alert);}ObjectMessage messageToSend = session.createObjectMessage();messageToSend.setObject(dataToSend);producer.send(messageToSend);// send message and then clean upsession.close();connection.close();} catch (Exception e) {log.error("Unexpected error occured", e);}
}

借助JMS 2.0和Java EE 7,您可以大大减少代码并使用链接调用:

@Inject    
private JMSContext context;    
@Resource(mappedName = "java:/jms/queue/EmailQueue")    
private Queue inboundQueue;    public void sendMessage (Map<Long, String> toSend, List<AlertAttachment> files) {HashMap<String, Alert> dataToSend = new HashMap<>();for (Long alertId : toSend.keySet()) {log.info(String.format("Sending alert %d to %s", alertId, toSend.get(alertId)));Alert alert = findAlert(alertId);alert.getAlertContent().setBodyMail(undecorateHTMLLinks(TemplateContextUtils.createMailMessage(alert, Configuration.getInstance())));dataToSend.put(toSend.get(alertId), alert);}context.createProducer().setPriority(1)!               .setTimeToLive(1000)!               .setDeliveryMode(NON_PERSISTENT)!               .send(inboundQueue, dataToSend);    
}

向前进

这些示例只是如何简化代码的冰山一角。 还有更多示例,但是这些是该项目中使用的主要示例。

请在评论部分发布您的示例。

另外,如果您想了解有关检查我的会话的更多信息,请参阅从Java EE 5到7的迁移故事,其中涵盖了我们为完全迁移应用程序而必须实现的一些解决方案。 每种情况都是不同的,没有正确的方法,但可以为您实现目标的道路提供一个很好的思路。

滑梯

Roberto Cortez 从Java EE 5到7的迁移故事

视频

翻译自: https://www.javacodegeeks.com/2015/11/reduce-legacy-from-java-ee-5-to-7.html

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

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

相关文章

struts2知识

一、 MVC Model 1&#xff1a;将所有的程序代码&#xff0c;都写到JSP页面中。 Model 2&#xff1a;JSP&#xff08;流程控制、数据显示&#xff09; JavaBean 改进的Model2&#xff1a;Servlet&#xff08;流程控制&#xff09; Jsp&#xff08;数据显示&#xff09; Ja…

mysql 数据修改时间_怎样修改mysql数据中的具体时间

匿名用户1级2016-12-30 回答应用场景&#xff1a;1、在数据表中&#xff0c;要记录每条数据是什么时候创建的&#xff0c;不需要应用程序去特意记录&#xff0c;而由数据数据库获取当前时间自动记录创建时间&#xff1b;2、在数据库中&#xff0c;要记录每条数据是什么时候修改…

sql插入临时表数据的方法

方法有两种&#xff0c;主要看需求。 方法1&#xff1a;定义好临时表的字段和类型、插入对应的值 create table #Tmp --创建临时表#Tmp (City varchar(50), --Country varchar(50), -- );insert #Tmp select 北京,中国 union select 东京,日本 union select 纽约,美国 se…

mysql冷热备_Mysql的冷备热备(数据备份)

冷备可以是mysql工具 msqldump。mysqldump -u username -p dbname table1 table2 ... -> BackupName.sqldbname 数据库名称table1 table2 是表名称BackupName.sql 备份保存的相对路径的sql文件执行下面命令。mysqldump -u homestead -psecret homestead > /home/vagrant/…

拼图项目:一个不完整的难题

马克雷因霍尔德&#xff08;Mark Reinhold&#xff09;最近提议延迟Java 9&#xff0c;以花更多的时间来完成Jigsaw项目&#xff0c;这是即将发布的版本的主要功能。 虽然这个决定肯定会使Java的厄运论者重回舞台&#xff0c;但我个人感到很放心&#xff0c;并认为这是一个很好…

gulp

1.gulp是什么&#xff1f; gulp是前端开发过程中一种基于流的代码构建工具&#xff0c;是自动化项目的构建利器&#xff1b;她不仅能对网站资源进行优化&#xff0c;而且在开发过程中很多重复的任务能够使用正确的工具自动完成&#xff1b;使用她&#xff0c;不仅可以很愉快的编…

往vxe-table添加渲染器怎么添_赚大了!飘窗上装书桌,加扇折叠窗,等于为家里又多添一间房...

阅读本文前&#xff0c;请您先点击上面蓝色字体&#xff0c;再点关 注这样您就可以继续免费收到文章注&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系我们进行删除&#xff0c;谢谢&#xff01; …

Kubernetes资源创建yml语法

前言 在是用kubernetes中&#xff0c;我们对资源的创建大部分都是通过 1kubelet create -f RESOURCE.yaml刚开看的时候不免有一些迷茫&#xff0c;看不懂语法&#xff0c;不知道怎么写&#xff1b;今天本文就介绍一下kubernetes construct语法。 Construct语法其实就是由kubele…

【六大排序详解】中篇 :选择排序 与 堆排序

选择排序 与 堆排序 选择排序 选择排序 与 堆排序1 选择排序1.1 选择排序原理1.2 排序步骤1.3 代码实现 2 堆排序2.1 堆排序原理2.1.1 大堆与小堆2.1.2 向上调整算法2.1.3 向下调整算法 2.2 排序步骤2.3 代码实现 3 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#…

java中contains的用法_java容器中所有接口和类的用法

我这里讲一下如何下载java的api文档还有就是容器和容器之间进行的操作每一个地方称之为一个节点&#xff0c;每一个节点包含了3部分(上一个节点&#xff0c;下一个节点&#xff0c;以及我们自己的数据部分)需要多个线程共享的时候通过键对象来找值对象1 java中的length属性是针…

lcs文本相似度_具有LCS方法的通用文本比较工具

lcs文本相似度常见的问题是检测并显示两个文本的差异&#xff08;尤其是几百行或几千行&#xff09;。 使用纯java.lang.String类方法可能是一种解决方案&#xff0c;但是对于此类操作最重要的问题是&#xff0c;“性能”将不能令人满意。 我们需要一种有效的解决方案&#xff…

MySQL--开发技巧(一)

Inner Join: Left Outer Join: Right Outer Join: Full Join: Cross Join&#xff1a; SELECT t1.attrs ,t2.attrs FROM t1 CROSS JOIN t2 使用Join更新表&#xff1a; UPDATE table1 SET attr2 WHERE attr1 IN (SELECT table2.attr1 FROM table1 INNER JOIN table2 ON tab…

查看mysql 中建立的表空间_mysql 表空间及索引的查看

1.查看索引(1)单位是GBSELECT CONCAT(ROUND(SUM(index_length)/(1024*1024*1024), 2), GB) AS Total Index Size FROM information_schema.TABLES WHERE table_schema LIKE database;------------------| Total Index Size |------------------| 1.70 GB |------------------(…

Java EE,Gradle和集成测试

在过去的几年中&#xff0c;Apache Maven已成为Java和Java EE项目的事实上的构建工具。 但是从两年前开始&#xff0c; Gradle便获得了越来越多的用户。 在我之前的文章&#xff08; http://www.lordofthejars.com/2015/10/gradle-and-java-ee.html &#xff09;之后&#xff0…

CSS 优化、提高性能的方法

如何提高CSS性能&#xff0c;根据页面的加载性能和CSS代码性能&#xff0c;主要总结有下面几点&#xff1a; 1、尽量将样式写在单独的css文件里面&#xff0c;在head元素中引用 有时候为了图方便或者快速搞定功能&#xff0c;我们可能会直接将样式写在页面的style标签或者直接内…

js url解码gbk_使用js解码gbk编码的字符串

如下字符串为 “产后恢复肚子”%B2%FA%BA%F3%BB%D6%B8%B4%B2%D9%CA%D3%C6%B5%BD%CC%B3%CC直接使用js的解码函数解码得到的都是乱码,可以使用下面的函数进行解码/*** js解码gbk url编码的字符串* param {[type]} str gbk编码字符串* param {[type]} charset 字符串的…

使用Mongo索引需要注意的几个点

1、正则表达式和取反运算符不适合建立索引 正则表达式&#xff1a;$regex 取反运算符&#xff1a;$ne &#xff0c;$nin 2、backgroud建立索引速度缓慢 前台创建是会有阻塞&#xff0c;backgroud效率缓慢&#xff0c;实际情况实际分析 3、mongo支持存储数组&#xff0c;并可将数…

play 打包 模块_编写Play 2的模块,第1部分:使工作正常

play 打包 模块几周前&#xff0c;我迁移了Play&#xff01; 框架 1.x版本的Deadbolt应用于Play 2平台&#xff0c;并且对缺少有关创建模块的信息感到惊讶。 Play 1.x文档中详细介绍了该主题&#xff0c;这使得创建模块非常简单。 显然&#xff0c;需要做些事情-这是关于为Play…

redhat6.8链路聚合

centos 6.X 聚合链路0、查看NetworkManager服务&#xff0c;停止NetworkManager服务。不做这一步很可能出问题 service NetworkManager status service NetworkManager stop1、修改三类文件 /etc/sysconfig/network-scripts/下的ifcfg-*文件 …

mysql 5.7 insert_MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器

在MySQL5.6版本里&#xff0c;不支持一个表有多个INSERT/DELETE/UPDATE触发器。例如创建t1表两个INSERT的触发器&#xff1a;DELIMITER $$USE test$$DROP TRIGGER /*!50032 IF EXISTS */ t1_1$$CREATE/*!50017 DEFINER ‘admin‘‘%‘ */TRIGGER t1_1 AFTER INSERT ON t1FOR E…