java ee 下版本_将旧版本从Java EE 5减少到7

java ee 下版本

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

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

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

这些原因值得商de,可能不足以说服某人进行升级。

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

停止旧版

码图

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

怎么样?

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

通过花费更少的时间来实现相同的功能,您不仅可以提高工作效率,而且引入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

java ee 下版本

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

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

相关文章

哪款 Linux 才是更好的 CentOS 替代品?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删AlmaLinux 是基于 RHEL 的企业级 Linux 发行版。以下是选择 AlmaLinux 作为 CentOS 替代方案的一些原因。CentOS 将于 2024 年 6 月到期。截至 2…

绩效从C到S,分享渣渣程序员逆袭秘诀!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删绩效面谈结束&#xff0c;从会议室出来&#xff0c;有一种不真实的感觉——这个季度我竟然拿了S&#xff1f;&#xff01;要知道&#xff0c;上个…

海贼王为什么画风突变_什么是突变测试?

海贼王为什么画风突变最近&#xff0c;我再三提到突变测试一词。 因为可以说这种方法能够以超出代码覆盖范围的方式检测测试安全网的空白&#xff0c;所以我花了一些时间来追赶这个话题并尝试一下。 这篇文章总结了我的发现&#xff0c;作为对该主题的快速介绍。 什么是变异测…

C语言 #define 与 typedef 的区别与用法

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删在C语言编程中&#xff0c;typedef 和 #define是最常用语句&#xff0c;可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typed…

硬核!400 行代码实现一个虚拟机

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删我们都知道理工科类的大学专业&#xff0c;一般都会在大一选择教授 C 语言作为编程入门语言&#xff0c;我最初接触编程也是入的 C 语言的坑。课…

Spring集成基础知识

本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适配器。 在这…

C++最佳实践 | 工具

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删前言C最佳实践: 支持Fork的编码标准文档本文档旨在收集对C最佳实践所进行的协作性讨论&#xff0c;是《Effective C》(Meyers) 和《C Coding Sta…

C语言函数返回 1 和返回 0 哪个好?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删基本上&#xff0c;没有人会将大段的C语言代码全部塞入 main() 函数。更好的做法是按照复用率高、耦合性低的原则&#xff0c;尽可能的将代码拆分…

抽象工厂和工厂方法示例_抽象工厂设计模式示例

抽象工厂和工厂方法示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查…

史上最污技术解读,我竟然秒懂了

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删假设你是个妹子&#xff0c;你有一位男朋友&#xff0c;于此同时你和另外一位男生暧昧不清&#xff0c;比朋友好&#xff0c;又不是恋人。你随时…

tdd java_Java TDD简介–第1部分

tdd java欢迎来到测试驱动开发 &#xff08;TDD&#xff09;系列的介绍。 我们将在TDD上下文中讨论Java和JUnit &#xff0c;但这只是工具。 本文的主要目的是使您全面了解TDD&#xff0c;而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD&#xff0c;那么您要么是…

C++最佳实践 | 代码风格

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C最佳实践:1. 工具2. 代码风格&#xff08;本文&#xff09;3. 安全性4. 可维护性5. 可移植性及多线程6. 性能7. 正确性和脚本代码风格代码风格最…

okhttp 连接池_okhttp 源码分析

https://square.github.io/okhttp/​square.github.iosquare/okhttp​github.com0 概述okhttp是一个现代的网络请求框架Http/2 支持 所有访问同一个主机的Request都共用一个socketconnection pool 连接池 减少请求延迟GZIP 压缩数据&#xff0c;减少传输所用的带宽Response Cac…

程序员日均写7行代码被开除,公司:正常员工每天200行

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删根据前不久CSDN发布的《2021-2022中国开发者调查报告》显示&#xff0c;大部分程序员平均每天会写200行左右的代码。那么代码的数量能衡量一个程…

抽象工厂和工厂方法示例_工厂方法设计模式示例

抽象工厂和工厂方法示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查…

这10个C语言技巧让初学者少走180天弯路!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删技巧 1&#xff1a;不要使用“GOTO”语句二十几年前&#xff0c;当计算机编程尚处于起步阶段时&#xff0c;程序流程是由“GOTO”语句来控制。该…

hystrix熔断 简介_Hystrix简介

hystrix熔断 简介在过去的几天里&#xff0c;我一直在探索Netflix Hystrix库&#xff0c;并欣赏了这个出色的库所提供的功能。 引用Hystrix网站上的内容&#xff1a; Hystrix是一个延迟和容错库&#xff0c;旨在隔离对远程系统&#xff0c;服务和第三方库的访问点&#xff0c…

89 个嵌入式相关概念,你懂几个?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删01操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内…

C语言不是最好的,却是我最爱的~

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删以下为译文&#xff1a;虽然 C 语言并不是我所学的第一门语言&#xff0c;也不是我的最后一门语言&#xff0c;但是我仍然非常喜欢 C&#xff0c…

lucene 源码分析_Lucene分析过程指南

lucene 源码分析本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中…