将旧版本从Java EE 5减少到7
Java EE 5于2005年首次引入,而Java EE 7于2013年問世。這兩個版本之間有7年的差距,從技術(shù)角度來說,這就像一個世紀。
許多組織仍然對使用Java EE 5感到困惑,并且有很多正當理由選擇不升級。 不過,如果您考慮一些前進的理由,這些將變得無關(guān)緊要:
- 受益于最新改進
- 2013年第一季度的Java 6 EOL
- 維護成本增加
- 難以保持開發(fā)人員的興趣
這些原因尚有爭議,可能不足以說服某人升級。
在過去的幾年中,我一直在開發(fā)具有相當大尺寸的應用程序,而最近它已從Java EE 5遷移到了7。
停止傳統(tǒng)
每年,都會引入新功能,以增加應用程序代碼庫。 它甚至超過了100萬行代碼! 僅憑這一事實就說明很難瀏覽如此龐大的代碼庫。 如果應用程序持續(xù)增長,隨著時間的流逝只會變得更糟。 從開始應用到現(xiàn)在,我們可以觀察到每年的增長一直穩(wěn)定,直到2015年為止。 此后,代碼仍在增長,但速度較慢。
怎么樣?
實際上,通過更改為Java EE 7,可以產(chǎn)生相同的結(jié)果,但是只需編寫更少的代碼。 對于小型應用程序來說,這似乎不是什么大問題,但是當我們談論一百萬時,它就產(chǎn)生了巨大的變化。
通過花費更少的時間來實現(xiàn)相同的功能,您不僅可以提高工作效率,而且引入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(“…”);} }其中大多數(shù)可以簡單地用@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) { … } }現(xiàn)在,我們可以在要驗證的字段中使用@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,您可以大大減少代碼并使用鏈接調(diào)用:
@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); }向前進
這些示例只是如何簡化代碼的冰山一角。 還有更多示例,但是這些是該項目中使用的主要示例。
請在評論部分發(fā)布您的示例。
另外,如果您想了解有關(guān)檢查我的會話的更多信息,請參閱從Java EE 5到7的遷移故事,其中涵蓋了我們?yōu)橥耆w移應用程序而必須實現(xiàn)的一些解決方案。 每種情況都是不同的,沒有正確的方法,但可以為您實現(xiàn)目標的道路提供一個很好的思路。
滑梯
Roberto Cortez 從Java EE 5到7的遷移故事視頻
翻譯自: https://www.javacodegeeks.com/2015/11/reduce-legacy-from-java-ee-5-to-7.html
總結(jié)
以上是生活随笔為你收集整理的将旧版本从Java EE 5减少到7的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果王者荣耀和安卓能一起玩吗(苹果王者荣
- 下一篇: (ftp linux 查看)