java ee 下版本

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 下版本

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

  1. 怎么给旧版本ios装旧版本软件

    1.准备软件 软件下载地址: itunes版本11:iTunes 11 Windows 64位版官方下载 - EFreeLife   (12版本及以下) 爱思助手:什么版本都可以 fideer(什么版 ...

  2. 问题解决:pycharm pip无法更新,显示更新成功,但版本依然是旧版本

    问题解决:pycharm pip无法更新,显示更新成功,但版本依然是旧版本 问题提出 pycharm中有时必须要求使用最新版本的pip,否则无法安装相关包.但是在软件内部setting-python ...

  3. 喜马拉雅FM有java版本吗_喜马拉雅fm2017最经典版本-喜马拉雅fm2017旧版本安装包v6.3.0.0 无广告版-腾牛安卓网...

    喜马拉雅fm2017旧版本安装包,一款有别官方版的特殊手机版本,可以让你们在坐车的时候使用,也可以在走路的时候进行试听,让你们不用在进行更新,也能够享受更多经典的服务. 喜马拉雅fm2017旧版本安装 ...

  4. java编译器jdk版本_以编程方式确定Java类的JDK编译版本

    java编译器jdk版本 当需要确定使用哪个JDK版本来编译特定的Java .class文件时, 通常使用的方法是使用javap并在javap输出中查找列出的"主要版本". 我在我 ...

  5. 我的世界java版使用剑_我的世界:JAVA版藏“私货”内置绝世好剑与神功,你玩的版本有吗...

    导语:我的世界:JAVA版藏"私货"内置绝世好剑与神功,你玩的版本有吗! 在我的世界这款游戏中,每件物品都有它自己存在的作用,铁镐挖矿,盔甲防护,却也有一些物品被创作者赋予了奇怪的 ...

  6. java test60006_派派6.0006旧版本v60006 老版本 Android

    派派6.0006旧版本,非常实用的老版本来了.这是一个聊天交友偷红包的游戏社交软件,不喜欢6.5000的小伙伴们可以下载老版本哦. 派派6.0006旧版本 派派是一款超新颖的熟人社交APP,带来熟人之 ...

  7. 我的世界java要哪个版本_我的世界网易 Java 版哪个版本比较好?

    基岩版手机界面的原因其他的答主已经回答了,那我就说说不同的java版吧 网易我的世界电脑版其实就是java版的移植(当然加了一些东西),之所以不用安装java是因为它内置了个java启动器,它的版本号 ...

  8. Windows下SVN回滚到旧版本(TortoiseSVN)

    原文地址:https://www.cnblogs.com/tommy-huang/p/4729634.html ---------------------------------------- 当发现 ...

  9. java获取java版本_在运行时获取Java版本

    最简单的方法(java.specification.version): double version = Double.parseDouble(System.getProperty("jav ...

最新文章

  1. 机器学习算法独热编码及机器学习英语网站
  2. TCP三次握手及四次挥手详细图解
  3. Redis的常用命令——String的常用命令
  4. 转载:JSON技术的调研报告(四种常见的JSON格式对比及分析)
  5. MobX快速入门教程(重要概念讲解)
  6. pycharm默认注释与快捷键功能
  7. Android 7.0 隐式广播-监听网络变化
  8. Linux 环境下 gzip 的加解密命令
  9. C语言的延时程序怎么改,C语言编程,怎么用按键来改变延时的长短?
  10. 如何解决代码嵌套太深问题
  11. flashfxp搜索服务器文件夹,FlashFXP 命令行参数
  12. 好把旧书多读到 义言一出见英明
  13. 安卓逆向 -- AndroidKiller介绍
  14. 饼图大小调整_PPT制作简约饼图,学会这一个就够了!
  15. Designing Network Design Spaces,译读
  16. SysY文法编译器前端设计实现
  17. 使用B站API:http://api.bilibili.com/x/space/upstat?mid=2026561407获取播放量、点赞量的返回报文中data数据缺失问题排查(已解决)
  18. 为什么正则表达式中.*可以匹配任意字符?
  19. android如何从json字符串中取自己想要的数据
  20. 优化新闻管理系统(分层)+代码封装

热门文章

  1. 51nod1551-集合交易【hall定理,最大权闭合图,网络流】
  2. 牛客-Forsaken喜欢独一无二的树【并查集,最小生成树】
  3. jzoj6375-华灵「蝶妄想」【结论题】
  4. jzoj3084-超级变变变【数学】
  5. 【2018.3.17】模拟赛之二-ssl1862jzoj1366 删数【区间dp】
  6. Graph Theory Class(Min25求1~n质数和)
  7. [XSY] 宝藏(LCS,DP)
  8. JavaFX图表(八)之堆积条形图
  9. Java 父类子类的对象初始化过程
  10. 【Python】Scrapy的安装与使用