java ee 下版本_将旧版本从Java EE 5减少到7
java ee 下版本
Java EE 5于2005年首次引入,而Java EE 7于2013年問(wèn)世。這兩個(gè)版本之間存在7年的差距,從技術(shù)角度來(lái)說(shuō),這就像一個(gè)世紀(jì)。
許多組織仍然對(duì)使用Java EE 5感到困惑,并且有很多正當(dāng)?shù)睦碛蛇x擇不升級(jí)。 不過(guò),如果您考慮一些前進(jìn)的理由,這些將變得無(wú)關(guān)緊要:
- 受益于最新改進(jìn)
- 2013年第一季度的Java 6 EOL
- 維護(hù)成本增加
- 難以保持開(kāi)發(fā)人員的興趣
這些原因值得商de,可能不足以說(shuō)服某人進(jìn)行升級(jí)。
在過(guò)去的幾年中,我一直在開(kāi)發(fā)具有相當(dāng)大尺寸的應(yīng)用程序,而最近它已從Java EE 5遷移到了7。
停止舊版
每年,都會(huì)引入新功能,以增加應(yīng)用程序代碼庫(kù)。 它甚至超過(guò)了100萬(wàn)行代碼! 單憑這一事實(shí)就表明很難瀏覽如此龐大的代碼庫(kù)。 如果應(yīng)用程序持續(xù)增長(zhǎng),隨著時(shí)間的流逝只會(huì)變得更糟。 自從應(yīng)用程序開(kāi)始以來(lái),我們可以觀察到直到2015年遷移發(fā)生之前,每年的增長(zhǎng)都是穩(wěn)定的。 此后,代碼仍在增長(zhǎng),但速度較慢。
怎么樣?
實(shí)際上,通過(guò)更改為Java EE 7,可以產(chǎn)生相同的結(jié)果,但是只需編寫(xiě)更少的代碼。 對(duì)于小型應(yīng)用程序,這似乎不是什么大問(wèn)題,但是當(dāng)我們談?wù)?00萬(wàn)個(gè)時(shí),它會(huì)產(chǎn)生巨大的變化。
通過(guò)花費(fèi)更少的時(shí)間來(lái)實(shí)現(xiàn)相同的功能,您不僅可以提高工作效率,而且引入bug的機(jī)會(huì)也更少,這是因?yàn)槟€可以減少混亂的代碼。
沒(méi)有人真的想要更改舊代碼,尤其是如果它正在運(yùn)行,甚至更糟的話,您也不知道為什么要使用它。 但是Java EE 7(和6)有一些易于使用的功能,從Java EE 5遷移時(shí)可以立即使用。
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ù)可以簡(jiǎn)單地用@Inject代替。
不再有本地接口
總是必須為您的Bean定義一個(gè)接口很麻煩,特別是如果它們僅在本地使用時(shí):
@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; }驗(yàn)證方式
由于Java EE 5中沒(méi)有Bean驗(yàn)證可用,因此有時(shí)您不得不采取以下措施:
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)在,我們可以在要驗(yà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); }向前進(jìn)
這些示例只是如何簡(jiǎn)化代碼的冰山一角。 還有更多示例,但是這些是該項(xiàng)目中使用的主要示例。
請(qǐng)?jiān)谠u(píng)論部分發(fā)布您的示例。
另外,如果您想了解有關(guān)檢查我的會(huì)話的更多信息,請(qǐng)參閱從Java EE 5到7的遷移故事,其中涵蓋了我們?yōu)橥耆w移應(yīng)用程序而必須實(shí)現(xiàn)的一些解決方案。 每種情況都不盡相同,沒(méi)有正確的方法,但可以為您實(shí)現(xiàn)目標(biāo)的道路提供一個(gè)很好的思路。
滑梯
Roberto Cortez 從Java EE 5到7的遷移故事視頻
翻譯自: https://www.javacodegeeks.com/2015/11/reduce-legacy-from-java-ee-5-to-7.html
java ee 下版本
總結(jié)
以上是生活随笔為你收集整理的java ee 下版本_将旧版本从Java EE 5减少到7的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: google play安卓下载(goog
- 下一篇: tdd java_Java TDD简介–