Archive for the ‘facu’ Category

¿qué es un java bean?

octubre 24, 2018

Todos los que miramos con alguna curiosidad a java y terminamos laburando nos hicimos esta pregunta. En este post vamos a tratar de dar una respuesta que vaya más allá de la definición formal.

Un bean es un objeto cuya existencia es controlada por un contenedor. Esto puede ser un servidor de aplicaciones java que implemente Java EE como Wildfly o Glassfish o bien por un framework como Spring, lo que permite tener beans en contenedores de servlets como el Tomcat. Así, podremos construir componentes que se comuniquen con otros con mucha facilidad.

Su creación es controlada por el ambiente en el que corren. Estos Beans pueden ser

  • Stateless cuando no conservan estado entre llamadas
  • Stateful cuando lo conservan
  • Orientados a mensajes

Nótese que esto no significa que un Stateless bean no altere el estado de nuestra aplicación, sino que si lo hace no debería hacerlo en su estado interno (sus atributos). Estas mutaciones del estado serán delegadas por nuestro bean a otros componentes, por ejemplo un Datasource al cuál le pediremos que ejecute un INSERT.

Los stateless son ideales para un servidor web, una API Rest. Al no conservar estado entre llamadas podemos tener un pool de beans. Al ser inmutables son paralelizables. Los stateful te permiten controlar una comunicación sincrónica como una transacción más compleja y deberemos ser cuidadosos con las condiciones de carrera y pensar esquemas de manejo de concurrencia. Los orientados a mensajes permiten una comunicación asincrónica, lo que nos permite desacoplar la ocurrencia de un evento con su respuesta.

Por otro lado según dónde vivan estos pueden ser Locales o Remotos. Los primeros se ejecutan en la misma máquina virtual que esta ejecutando nuestra aplicación. Los segundos lo hacen en otra máquina virtual y la comunicación muy probablemente se de mediante un socket tcp. Antes eran mediante una tecnología arcana como RMI y desde hace unos años por HTTP usando SOAP o REST.

Hace muchos años implementar todo esto era un dolor de cabeza. Había que crear una serie de archivos XMLs, implementar una interfaz y una clase y seguir otra serie de configuraciones que hacían temblar al más pintado. J2EE era una de esas tecnologías prometedoras pero implementarla solía ser muy frustrante. Spring ofreció una alternativa más sencilla -y eso que parecen bastante crípticos los xmls de spring- y eventualmente se convirtió en el la implementación más usada de beans. Con la inclusión de anotaciones, oportunamente terminó influenciando a la especificación de Java Enterprise y podemos decir que desde EJB3 tenemos una implementación estandarizada que toma lo mejor de ambos mundos.  Hoy este estándar tiene implementaciones como Weld, Guice y por supuesto Spring.

La inyección de dependencias es el proceso mediante el cuál un contenedor provee a un objeto de los objetos de los cuales estos dependen para operar. Supongamos que tenemos un componente que necesita comunicarse mediante un Datasource con una base de datos. Este componente tendrá un atributo para el datasource. El inyector de dependencias asignará una instancia del datasource en el componente para que este lo pueda usar sin tener que inicializarlo uno a mano.

Los beans y la inyección de dependencia hoy están presentes en todas las aplicaciones java medianamente grandes. Los componentes en Angular con sus mecanismos de inyección de dependencias son otro escenario donde se aplicaron estas ideas, como así también Symfony o PHP-DI.

Las anotaciones más conocidas por función son:

  • Definición de beans:
    • @javax.ejb.Sateless: Decoran una clase que el contenedor usará para construir un Stateful bean
    • @javax.ejb.Sateful: Decoran una clase que el contenedor usará para construir un Stateless bean
    • @javax.ejb.MessageDriven: Una clase que manejará un bean dirigido por mensajes
    • @javax.ejb.Entity: La clase mapea una entidad en JPA
    • @.Document: Spring data provee tipos document para distintos repositorios de documentos como MongoDB o SOLR. Es similar a un Entity.
  • Inyección de dependencias
    • @EJB / @Autowired: asocian un atributo a una instancia de otro bean controlado por el contenedor
    • @Datasource: asocian el atributo o el getter que decoran con un datasource
    • @PersistenceContext / @EntityManager: algo similar pero con JPA. Nos permite persistir entidades
  •  Ciclo de vida
    • @PostConstruct: Se ejecuta luego de que el contenedor construyó un bean con todas sus dependencias
    • @PreDestroy: Se ejecuta antes de que el contenedor lo destruya y contamos todas las dependencias

El estándar permite agregar interceptores, estos son métodos que se ejecutan antes y después, lo cuál hace aún más flexible el trabajo con beans, aunque también un poco confuso al principio.

También podemos combinar distintas implementaciones según el ambiente donde desplegamos sin que el código de nuestros componentes cambien. Supongamos que tenemos una componente que lleva una lista de TODOs que depende de un @PersistenceContext, si no usamos ninguna función propietaria en un ambiente este podría ser basado en JPA sobre Postgresql y en otro JPA sobre MySQL. El componente que registra los TODOs usa las primitivas provistas por JPA. Quien configure el Datasource de JPA solo tendrá que cambiar el driver y la configuración del host y credenciales de acceso. El componente de administración de TODOs no cambiará.

Los beans permiten implementar componentes más sencillos de programar, legibles y mantenibles, delegando la complejidad de la construcción, la parametrización y su ciclo de vida al contenedor. Paul Graham dice en Hackers and Painters que la programación orientada a objetos deviene inexorablemente en spaghetti code sustentable. Los beans ayudan a que nos quede un poco más al dente.

Anuncios

biodiversidad para todos

abril 28, 2012

Entre las muchas cosas que tenemos por acá y que no valoramos porque por ahí no conocemos o porque no quieren que conozcamos, una de las más bellas es la biodiversidad.

Argentina por su extensión cuenta con muchos biomas. Desde desiertos en zonas subtropicales hasta turbales y bosques en la patagonia, sin mencionar nuestro mar. Parte de ese patrimonio enloqueció al propio Charles Darwin.

Nosotros, por cosas de la vida, pasamos de largo y no nos damos cuenta, incluso vivimos amontonados acá en el centro. Bueno, no todos. Existe una gran cantidad de gente interesada en estos temas, coleccionistas de fotos de animales y plantas, biólogos, guardaparques, profesionales del turismo y aficionados a la vida al aire libre que valoran esta riqueza y se esfuerzan en registrarla y que esta tenga el lugar que merece.

Actualmente, estamos analizando y diseñando con unos compañeros de la facultad una herramienta para ayudar al trabajo y la difusión de la biodiversidad en la Argentina y en lo posible colaborar con el desarrollo científico en estos campos. Quien sabe en unos meses tengamos novedades por acá…