Un bean es una clase Java con nombres de métodos que siguen las pautas de Java Bean (también llamados patrones de diseño) para propiedades , métodos y eventos.. Por lo tanto, cualquier método público de la clase bean que no forme parte de una definición de propiedad es un método bean. Como mínimo, una clase Java, incluso con una propiedad como único miembro (por supuesto, se requiere un getter y setter público acompañante), un método público como único miembro o solo un método de registro de escucha de eventos públicos es un bean Java. Además, la propiedad puede ser propiedad de solo lectura (tiene un método getter pero no setter) o propiedad de solo escritura (tiene solo un método setter). El bean Java debe ser una clase pública para que sea visible para cualquier herramienta o contenedor de beanbox. El contenedor debe poder instanciarlo; por lo tanto, debe tener un constructor público también. La especificación JavaBeansno requiere que un bean tenga un constructor público de cero argumentos, explícito o predeterminado, para que un contenedor lo instancia. Si pudiera proporcionar un archivo (con extensión .ser) que contenga una instancia serializada, una herramienta beanbox podría usar ese archivo para crear una instancia de un prototipo de bean. De lo contrario, el bean debe tener un constructor público de cero argumentos, explícito o predeterminado.
Una vez que se instancia el bean, la API de Java Bean (java.beans. *) Puede introspectarlo y llamar a métodos en él. Si no hay disponible ninguna clase que implemente la interfaz BeanInfo o que extienda una implementación de BeanInfo, la clase SimpleBeanInfo, la introspección implica el uso de la reflexión (introspección implícita) para estudiar los métodos admitidos por un bean de destino y luego aplicar patrones de diseño simples (las pautas) para deducir de aquellos métodos con los que se admiten propiedades, eventos y métodos públicos. Si una clase que implementa la interfaz BeanInfo (para un bean Foo, debe llamarse FooBeanInfo) está disponible, la API omite la introspección implícita y utiliza métodos públicos (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) de esta clase para obtener el información. Si una clase que extiende SimpleBeanInfo está disponible, dependiendo de cuál de los métodos públicos SimpleBeanInfo (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) se anula, utilizará esos métodos anulados para obtener información; para un método que no se anula, el valor predeterminado será la introspección implícita correspondiente. Un bean necesita ser instanciado de todos modos, incluso si no se lleva a cabo una introspección implícita. Por lo tanto, el requisito de un constructor público zeri-args. Pero, por supuesto, la interfaz Serializable o Externalizable no es necesaria para que sea reconocida. Sin embargo, la especificación de Java Bean dice: "También nos gustaría que fuera" trivial "para el caso común de un pequeño Bean que simplemente quiere tener su estado interno guardado y no quiere pensar en ello". Por lo tanto, todos los beans deben implementar una interfaz serializable o externalizable. En general, La especificación JavaBeans no es difícil y rápida sobre lo que constituye un bean. "Escribir componentes JavaBeans es sorprendentemente fácil. No necesitas una herramienta especial y no tienes que implementar ninguna interfaz. Escribir beans es simplemente una cuestión de seguir ciertas convenciones de codificación. Todo lo que tienes que hacer es hacer que tu clase se vea como un bean: las herramientas que usan beans podrán reconocer y usar su bean ". Trivialmente, incluso la siguiente clase es un Java Bean,
public class Trivial implements java.io.Serializable {}
Digamos que un constructor de beans tiene algunos parámetros. Supongamos que algunos son tipos simples. Es posible que el contenedor no sepa qué valores asignarles; incluso si lo hace, la instancia resultante podría no ser reutilizable. Puede tener sentido solo si el usuario puede configurar (especificar valores) mediante anotaciones o archivos de configuración xml como en Spring Beans. Y supongamos que algunos parámetros son tipos de clase o interfaz. Nuevamente, el contenedor podría no saber qué valores asignarle. Puede tener sentido solo si el usuario puede configurar (especificar objetos específicos) mediante anotaciones o archivos de configuración xml. Sin embargo, incluso en Spring (a través de archivos de configuración xml), la asignación de objetos específicos (con nombres de cadena) a argumentos del constructor (atributo o elemento de los argumentos del constructor) no es seguro; es básicamente como la inyección de recursos. Hacer referencias a otros beans Spring (llamados colaboradores; a través de un elemento en un elemento de argumento de constructor) es básicamente una inyección de dependencia y, por lo tanto, es seguro. Obviamente, una dependencia (bean colaborador) podría tener un constructor con parámetros inyectados; esas dependencias inyectadas pueden tener un constructor con parámetros, etc. En este escenario, en última instancia, necesitaría algunas clases de beans (por ejemplo, MyBean.class) que el contenedor puede instanciar simplemente llamando a New MyBean () antes de que pueda construir los otros beans colaborativos a través de la inyección de dependencia en los constructores, por lo tanto, el requisito para los beans para tener un constructor público de cero args. Supongamos que si un contenedor no admite la inyección de dependencia y / o no permite asignar valores de tipo simple al constructor a través de algunas anotaciones o archivos de configuración xml como en Spring, los constructores de beans no deberían tener parámetros. Incluso una aplicación Spring beans necesitaría algunos beans para tener un constructor público de cero args (por ejemplo, en un escenario donde su aplicación Spring no tiene bean con solo tipos simples como argumentos de constructor).
Los beans gestionados por JSF se ejecutan en un contenedor web. Se pueden configurar con la anotación @ManagedBean o con un archivo de recursos de configuración de la aplicación managed-bean.xml. Sin embargo, solo admite la inyección a través de la inyección de recursos (no de tipo seguro); no apto para inyección en constructores. los especificación JSFrequiere que los beans gestionados tengan un constructor público de argumento cero. Además, dice: “A partir de la versión 2.3 de esta especificación, se desaconseja el uso de la función de bean administrado como se especifica en esta sección. Una solución mejor y más integrada para resolver el mismo problema es usar Contexts and Dependency Injection (CDI), como se especifica en JSR-365 ". a Spring beans. La especificación CDI adopta la especificación Managed Beans, que se aplica a todos los contenedores de la plataforma JEE, no solo al nivel web. Por lo tanto, el contenedor web necesita implementar la especificación CDI.
Aquí hay un extracto de la especificación Managed Bean
“Los beans gestionados son objetos gestionados por contenedor con requisitos mínimos, también conocidos bajo el acrónimo“ POJOs ”(Objetos Java simples y sencillos) ... pueden verse como una versión mejorada de la plataforma Java EE del modelo de componentes JavaBeans que se encuentra en la plataforma Java SE ... El lector no pasará por alto que los beans gestionados tienen un precursor en la instalación homónima que se encuentra en la tecnología JavaServer Faces (JSF) ... Los beans gestionados tal como se definen en esta especificación representan una generalización de los que se encuentran en JSF; en particular, Managed Beans se puede usar en cualquier lugar de una aplicación Java EE, no solo en módulos web. Por ejemplo, en el modelo de componente básico, los beans gestionados deben proporcionar un constructor sin argumentos, pero una especificación que se basa en beans gestionados, como CDI (JSR-299), puede relajar ese requisito y permitir que los beans gestionados proporcionen a los constructores firmas más complejas, siempre que sigan algunas reglas bien definidas ... Un bean gestionado no debe ser: una clase final, una clase abstracta, una clase interna no estática . Un bean gestionado puede no ser serializable a diferencia de un componente JavaBean normal ". Por lo tanto, la especificación para beans gestionados, también conocidos como POJO o beans POJO, permite la extensión como en CDI.
La especificación CDI redefine los beans gestionados como: Cuando se ejecuta en Java EE, una clase Java de nivel superior es un bean gestionado si cumple los requisitos:
• No es una clase interna. • Es una clase no abstracta, o se anota @Decorator. • No implementa javax.enterprise.inject.spi.Extension. • No está anotado @Vetoed o en un paquete anotado @Vetoed. • Tiene un constructor apropiado, ya sea: la clase tiene un constructor sin parámetros, o la clase declara un constructor anotado @Inject.
Todas las clases Java que cumplen con estas condiciones son beans administrados y, por lo tanto, no se requiere una declaración especial para definir un bean administrado. O
si se define como un bean administrado por cualquier otra especificación Java EE y si
• No se anota con una anotación que define el componente EJB ni se declara como una clase de bean EJB en ejb-jar.xml.
A diferencia de Spring Beans, no admite constructores con tipos simples, lo que podría ser posible si admitiera la configuración con archivos de configuración xml como en Spring o cualquier anotación.
Los EJB se ejecutan en un contenedor EJB. Sus especificacióndice: "Un componente de bean de sesión es un bean administrado". "La clase debe tener un constructor público que no tome argumentos", dice tanto para bean de sesión como para bean controlado por mensajes. Además, dice: "La clase de bean de sesión es no es necesario para implementar la interfaz SessionBean o la interfaz serializable ". Por la misma razón que los beans JSF, que la inyección de dependencia EJB3 es básicamente una inyección de recursos, los beans JSF no admiten constructores con argumentos, es decir, mediante inyección de dependencia. Sin embargo, si el contenedor EJB implementa CDI, "Opcionalmente: la clase puede tener un constructor adicional anotado con la anotación Inject ", dice tanto para bean de sesión como para bean controlado por mensaje porque" un EJB empaquetado en un archivo de bean CDI y no anotado con javax.enterprise.inject. Anotación vetada, se considera un CDI habilitado frijol."