java历史版本在哪里找_mysql

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

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

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

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

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

停止传统

java历史版本在哪里找_python_02

每年,都会引入新功能,以增加应用程序代码库。 它甚至超过了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 up
        session.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