{"id":1487,"date":"2013-12-26T11:48:31","date_gmt":"2013-12-26T16:48:31","guid":{"rendered":"http:\/\/alejandroayala.solmedia.ec\/?p=1487"},"modified":"2013-12-26T11:49:55","modified_gmt":"2013-12-26T16:49:55","slug":"comparando-jsf-beans-cdi-beans-y-ejbs","status":"publish","type":"post","link":"https:\/\/alejandroayala.solmedia.ec\/?p=1487","title":{"rendered":"Comparando JSF Beans, CDI Beans y EJB&#8217;s"},"content":{"rendered":"<p style=\"text-align: justify;\"><strong>Todav\u00eda existe gran confusi\u00f3n<\/strong> acerca de los diferentes tipos de <em>beans<\/em> que proporciona <em>Java EE 6<\/em>: <em>EJBs<\/em>, <em>CDI<\/em> y los <em>beans JSF<\/em>. Este art\u00edculo intentar\u00e1 aclarar la diferencia entre ellos y el uso que se deber\u00edan darse.<\/p>\n<h2 style=\"text-align: justify;\">Bean Administrados JSF, CDI y EJB&#8217;s<\/h2>\n<p style=\"text-align: justify;\"><em>JSF<\/em> fue desarrollado en un inicio con <strong>su propio administrador de <em>beans<\/em> y mecanismo de inyecci\u00f3n de dependencias<\/strong>, el mismo que fue mejorado en la versi\u00f3n 2.0 de <em>JSF<\/em> al incluir anotaciones. Cuando <em>CDI<\/em> fue lanzado en <em>Java EE 6<\/em>, fue considerada como el <em>framework<\/em> para administrar <em>beans<\/em> de toda la plataforma, dejando obsoletos a los <em>EJB&#8217;s<\/em> y todos sus componentes a su alrededor.<\/p>\n<p style=\"text-align: justify;\"><!--more--><\/p>\n<p style=\"text-align: justify;\"><strong>El problema es saber cual usar y cuando usarlo<\/strong>, porque todos tiene el mismo proceso, empecemos con el mas sencillo y simple, los beans <em>JSF<\/em>.<\/p>\n<h2 style=\"text-align: justify;\">Beans JSF<\/h2>\n<p style=\"text-align: justify;\">En pocas palabras, <strong>no los uses si est\u00e1s desarrollando para <em>Java EE 6<\/em> y usando <em>CDI<\/em><\/strong>. Estos proveen un mecanismo simple para la inyecci\u00f3n de dependencia, el trabajo de la l\u00f3gica de negocio y las p\u00e1ginas web, <strong>pero son menos potentes que los beans<\/strong> <em>CDI<\/em>.<\/p>\n<p style=\"text-align: justify;\">Se pueden definir usando la anotaci\u00f3n <a href=\"http:\/\/docs.oracle.com\/cd\/E17802_01\/j2ee\/javaee\/javaserverfaces\/2.0\/docs\/managed-bean-api\/javax\/faces\/bean\/ManagedBean.html\" target=\"_blank\">@javax.faces.bean.ManagedBean<\/a> el cual tiene un par\u00e1metro opcional <strong><em>name<\/em><\/strong>. Este nombre puede ser usado para referenciar el <em>bean<\/em> desde la p\u00e1gina <em>JSF<\/em>.<\/p>\n<p style=\"text-align: justify;\">El \u00e1mbito aplicado a los <em>beans<\/em> est\u00e1n definidos en el paquete <a href=\"http:\/\/docs.oracle.com\/cd\/E17802_01\/j2ee\/javaee\/javaserverfaces\/2.0\/docs\/managed-bean-api\/javax\/faces\/bean\/package-summary.html\" target=\"_blank\">javax.faces.bean<\/a> el cual incluye \u00e1mbitos como: <em>request, session, application<\/em>, tambi\u00e9n tiene \u00e1mbitos\u00a0 de vista(<em>view<\/em>) y personalizados(<em>custom<\/em>).<\/p>\n<p>[java]<br \/>\n@ManagedBean(name=&quot;someBean&quot;)<br \/>\n@RequestScoped<br \/>\npublic class SomeBean {<br \/>\n&#8230;.<br \/>\n&#8230;.<br \/>\n}<br \/>\n[\/java]<\/p>\n<p style=\"text-align: justify;\">Los beans <em>JSF<\/em> <strong>no se pueden mezclar con otro tipo de <em>beans<\/em><\/strong> sin ning\u00fan tipo de codificaci\u00f3n manual.<\/p>\n<h2>Beans CDI<\/h2>\n<p style=\"text-align: justify;\"><em>CDI<\/em> es el <em>framework<\/em> de inyecci\u00f3n de dependencia y administraci\u00f3n de beans, lanzado como parte del <em>Java EE 6<\/em> que incluye una c<strong>ompleta, integral y f\u00e1cil administraci\u00f3n de <em>beans<\/em><\/strong>. Los <em>beans CDI<\/em> son <strong>mas avanzados y flexibles que los <em>beans<\/em> <em>JSF<\/em><\/strong>, principalmente por los <em>interceptores<\/em> y \u00e1mbitos de conversaci\u00f3n(<em>conversation<\/em>), <em>eventos<\/em>, <em>decoradores <\/em>y mas.<\/p>\n<p style=\"text-align: justify;\">Para <em>deployar<\/em> <em>beans<\/em> <em>CDI<\/em>, hay que crear el archivo <em><strong>beans.xml<\/strong><\/em> en la carpeta <em><strong>META-INF<\/strong><\/em> del proyecto, los \u00e1mbitos de los<em> beans CDI<\/em> est\u00e1n definidos en el paquete\u00a0 <a href=\"http:\/\/docs.oracle.com\/javaee\/6\/api\/javax\/enterprise\/context\/package-summary.html\" target=\"_blank\">javax.enterprise.context<\/a> (<em>namely, request, conversation, session y application<\/em>). Si quieres usar los <em>beans<\/em> <em>CDI<\/em> con una p\u00e1gina <em>JSF<\/em> se la puede <em>nombrar<\/em> usando la anotaci\u00f3n <a href=\"http:\/\/docs.oracle.com\/javaee\/6\/api\/javax\/inject\/Named.html\" target=\"_blank\">javax.inject.Named<\/a>. Para inyectar un <em>bean<\/em> dentro de otro, se puede anotar una variable con la anotaci\u00f3n <a href=\"http:\/\/docs.oracle.com\/javaee\/6\/api\/javax\/inject\/Inject.html\" target=\"_blank\">javax.inject.Inject<\/a>.<\/p>\n<p>[java]<br \/>\n@Named(&quot;someBean&quot;)<br \/>\n@RequestScoped<br \/>\npublic class SomeBean {<\/p>\n<p>@Inject<br \/>\nprivate SomeService someService;<br \/>\n}<br \/>\n[\/java]<\/p>\n<p style=\"text-align: justify;\">La <strong>inyecci\u00f3n autom\u00e1tica<\/strong> como la definida anteriormente puede ser controlado a trav\u00e9s del uso <a href=\"http:\/\/docs.oracle.com\/javaee\/6\/api\/javax\/inject\/Qualifier.html\" target=\"_blank\">Qualifiers<\/a> que pueden ayudar a conectar a la clase espec\u00edfica que desea inyectar.<\/p>\n<p style=\"text-align: justify;\"><em>CDI<\/em> maneja la inyecci\u00f3n en \u00e1mbitos que pueden no ser los mismos mediante el uso de <em>proxies<\/em>. Debido a esto, <strong>se puede inyectar un <em>bean <\/em>de \u00e1mbito petici\u00f3n dentro de un <em>bean<\/em> de \u00e1mbito de sesi\u00f3n<\/strong> y la referencia va a ser v\u00e1lida ante cada nueva petici\u00f3n, el <em>proxy<\/em> reconeta las instancias vivas de los \u00e1mbitos de los <em>beans<\/em>.<\/p>\n<p style=\"text-align: justify;\"><em>CDI<\/em> tambi\u00e9n soporta <strong><em>eventos<\/em>, <em>interceptores<\/em>, <em>\u00e1mbitos de conversaci\u00f3n<\/em><\/strong> y muchas otras caracter\u00edsticas que hacen que estos sean superiores a los <em>beans JSF<\/em>.<\/p>\n<h2>EJBs<\/h2>\n<p style=\"text-align: justify;\">Los <em>EJB&#8217;s<\/em> preceden a los <em>beans<\/em> <em>CDI<\/em> y son <strong>en algunos casos muy similares y en otros casos muy distintos<\/strong>, las diferencias entre ellos son que los <em>EJB&#8217;s<\/em> son:<\/p>\n<ul>\n<li>Transaccionales<\/li>\n<li>\u00a0Remotos o locales<\/li>\n<li>\u00a0Son capaces de neutralizar beans <em>stateless<\/em>(sin estado) para liberar recursos<\/li>\n<li>\u00a0Son capaces de usar <em>temporizadores<\/em><\/li>\n<li>\u00a0Pueden ser <em>asincr\u00f3nicos<\/em><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Los dos tipos de <em>EJBs<\/em> <strong>son llamados<\/strong> <em>stateless<\/em> y <em>stateful<\/em>, Los <em>EJBs<\/em> <em>stateless<\/em> pueden ser pensados como hilos seguros de un uso \u00fanico<strong> sin mantener el estado entre dos peticiones<\/strong>. Los <strong>EJBs<\/strong> <em>stateful<\/em> mantienen el estado y puede ser creados y <strong>mantener su estado por un largo tiempo<\/strong> que sean necesarios hasta que estos sean eliminados.<\/p>\n<p style=\"text-align: justify;\">Definir un <em>EJB<\/em> es simple, solo hay que anotar la clase con <a href=\"http:\/\/docs.oracle.com\/javaee\/6\/api\/javax\/ejb\/Stateless.html\" target=\"_blank\">javax.ejb.Stateless<\/a> o <a href=\"http:\/\/docs.oracle.com\/javaee\/6\/api\/javax\/ejb\/Stateful.html\" target=\"_blank\">javax.ejb.Stateful<\/a>.<\/p>\n<p style=\"text-align: justify;\">Los <em>beans Stateless<\/em> <strong>debe tener un \u00e1mbito dependiente<\/strong>, mientras que un <em>bean stateful<\/em> puede tener cualquier \u00e1mbito.<\/p>\n<p style=\"text-align: justify;\">Mientras que los <em>beans EJBs y CDI<\/em> son diferentes en t\u00e9rminos de caracter\u00edsticas, al escribir c\u00f3digo para integrarlos son muy similares, desde los <strong><em>beans CDI<\/em> pueden ser inyectado dentro de <em>EJB&#8217;s<\/em> y los <em>EJB&#8217;s<\/em> pueden ser inyectados dentro de <em>beans<\/em> <em>CDI<\/em><\/strong>. No hay necesidad de hacer distinci\u00f3n cuando se inyecta el uno dentro del otro. Una vez m\u00e1s, los diferentes \u00e1mbitos son manejados por <em>CDI<\/em> a trav\u00e9s de <em>proxies<\/em>. Una excepci\u00f3n a esto es que los <strong><em>CDI<\/em> no tienen soporte para inyectar <em>EJBs<\/em> remotos<\/strong> pero estos pueden ser implementados al escribir metodos <em>Producer<\/em>.<\/p>\n<p style=\"text-align: justify;\">La anotaci\u00f3n <a href=\"http:\/\/docs.oracle.com\/javaee\/6\/api\/javax\/inject\/Named.html\" target=\"_blank\">javax.inject.Named<\/a> as\u00ed como cualquier <a href=\"http:\/\/docs.oracle.com\/javaee\/6\/api\/javax\/inject\/Qualifier.html\" target=\"_blank\">Qualifier<\/a> se pueden utilizar en un <em>EJB<\/em> para hacerlo coincidir con un punto de inyecci\u00f3n.<\/p>\n<h2>Cuando usar estos beans<\/h2>\n<p style=\"text-align: justify;\">\u00bfC\u00f3mo saber cuando usar un bean? Simple.<\/p>\n<p style=\"text-align: justify;\"><strong>Nunca uses beans JSF a menos que est\u00e9s trabajando con un contenedor de servlet y no quieras incorporar CDI a Tomcat<\/strong>(aunque exite un <a href=\"http:\/\/www.andygibson.net\/blog\/projects\/knappsack\/\" target=\"_blank\"><em>arquetipo<\/em> <em>Maven<\/em><\/a> para esto, no hay escusas).<\/p>\n<p style=\"text-align: justify;\">En general, deberias usar <em>beans CDI<\/em> a <strong>menos que necesites disponible las funcionalidades avanzadas de los <em>EJB&#8217;s<\/em><\/strong> como la transaccionalidad. Puedes escribir tus propios <a href=\"http:\/\/smokeandice.blogspot.com\/2009\/12\/cdi-and-declarative-transactions.html\" target=\"_blank\"><em>interceptores<\/em><\/a> para hacer a los <em>beans CDI<\/em> transacciones, pero por ahora, es simple usar un <em>EJB<\/em> dentro de un <em>CDI<\/em> para obtener <em>CDI&#8217;s<\/em> transaccionaes. Si estas atascado en un contenedor de <em>servlet<\/em> y estas usando <em>CDI<\/em>, entonces la \u00fanica opci\u00f3n de transaccionalidad sin <em>EJB<\/em> es usar tus manos para escribir <em>interceptores<\/em>.<\/p>\n<p><strong>Fuente:<\/strong> <a href=\"http:\/\/www.andygibson.net\/blog\/article\/comparing-jsf-beans-cdi-beans-and-ejbs\/\" target=\"_blank\">http:\/\/www.andygibson.net\/blog\/article\/comparing-jsf-beans-cdi-beans-and-ejbs\/<\/a><\/p>\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=a1ejo_ayala\" class=\"twitter-share-button\" data-size=\"large\">Twittear<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Todav\u00eda existe gran confusi\u00f3n acerca de los diferentes tipos de beans que proporciona Java EE 6: EJBs, CDI y los beans JSF. Este art\u00edculo intentar\u00e1 aclarar la diferencia entre ellos y el uso que se deber\u00edan darse. Bean Administrados JSF, CDI y EJB&#8217;s JSF fue desarrollado en un inicio con su propio administrador de beans\u2026 <span class=\"read-more\"><a href=\"https:\/\/alejandroayala.solmedia.ec\/?p=1487\">Leer m\u00e1s &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":690,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[4],"tags":[410,409,408,417,413,506,116,111,411,412,416,415,414],"_links":{"self":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1487"}],"collection":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1487"}],"version-history":[{"count":4,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1487\/revisions"}],"predecessor-version":[{"id":1491,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1487\/revisions\/1491"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/media\/690"}],"wp:attachment":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1487"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1487"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}