SeamFramework.orgCommunity Documentation
Actualmente la IR de Web Beans sólo se ejecuta en JBoss AS 5; integrando la IR dentro de otros entornos EE (por ejemplo otro servidor de aplicación como Glassfish), dentro de un contenedor de servlet (como Tomcat), o con una implementación incrustada EJB3.1 es bastante fácil. En este apéndice veremos brevemente los pasos requeridos.
Debería ser posible ejecutar Web Beans en un entorno SE, pero tendría que hacer más cosas, agregar sus propios contextos y ciclo de vida. La IR de Web Beans actualmente no expone puntos de extensión del ciclo de vida, por lo tanto se tendría que codificar directamente en clases IR de Web Beans.
El SPI de Web Beans está ubicado en el módulo webbeans-ri-spi
, empaquetado como webbeans-ri-spi.jar
. Algunos SPI son opcionales, si necesita anular la conducta predeterminada, se requerirán otros.
Se puede especificar la implementación de un SPI ya sea como una propiedad del sistema, o en un archivo de propiedades META-INF/web-beans-ri.properties
. Todos los nombres de propiedad son el nombre completo de clase de la interfaz implementada; todos los valores de propiedad son el nombre completo de clase calificado de la clase de implementación.
Todas las interfaces en el patrón decorador SPI soportan y proporcionan una clase Forwarding
.
public interface WebBeanDiscovery {
/**
* Gets list of all classes in classpath archives with web-beans.xml files
*
* @return An iterable over the classes
*/
public Iterable<Class<?>
> discoverWebBeanClasses();
/**
* Gets a list of all web-beans.xml files in the app classpath
*
* @return An iterable over the web-beans.xml files
*/
public Iterable<URL
> discoverWebBeansXml();
}
El descubirmiento de clases de Web Bean y de archivos web-bean.xml
es autoexplicativo (el algoritmo está descrito en la sección 11.1 de la especificación JSR299 y no se repite aquí).
Se le puede pedir a la IR de Web Beans cargar la implementación de WebBeanDiscovery
mediante la propiedad org.jboss.webbeans.bootstrap.WebBeanDiscovery
con el nombre completo de la clase calificada como el valor. Por ejemplo:
org.jboss.webbeans.bootstrap.spi.WebBeanDiscovery=org.jboss.webbeans.integration.jbossas.WebBeanDiscoveryImpl
Si la IR de Web Beans se utiliza en un contenedor de Servlet, se espera un constructor de la forma:
public WebBeanDiscoveryImpl(ServletContext servletContext) {}
El contexto de servlet se puede utilizar para permitir que la implementación de WebBeanDiscovery
interactúe con el contenedor.
La IR de Web Beans también delega el descubrimiento de bean EJB3 al contenedor para no tener que examinar las anotaciones EJB3 o analizar ejb-jar.xml
. Para cada EJB en la aplicación se debe descubrir un EJBDescriptor:
public interface EjbDiscovery
{
public static final String PROPERTY_NAME = EjbDiscovery.class.getName();
/**
* Gets a descriptor for each EJB in the application
*
* @return The bean class to descriptor map
*/
public Iterable<EjbDescriptor<?>
> discoverEjbs();
}
public interface EjbDescriptor<T
> {
/**
* Gets the EJB type
*
* @return The EJB Bean class
*/
public Class<T
> getType();
/**
* Gets the local business interfaces of the EJB
*
* @return An iterator over the local business interfaces
*/
public Iterable<BusinessInterfaceDescriptor<?>
> getLocalBusinessInterfaces();
/**
* Gets the remote business interfaces of the EJB
*
* @return An iterator over the remote business interfaces
*/
public Iterable<BusinessInterfaceDescriptor<?>
> getRemoteBusinessInterfaces();
/**
* Get the remove methods of the EJB
*
* @return An iterator over the remove methods
*/
public Iterable<Method
> getRemoveMethods();
/**
* Indicates if the bean is stateless
*
* @return True if stateless, false otherwise
*/
public boolean isStateless();
/**
* Indicates if the bean is a EJB 3.1 Singleton
*
* @return True if the bean is a singleton, false otherwise
*/
public boolean isSingleton();
/**
* Indicates if the EJB is stateful
*
* @return True if the bean is stateful, false otherwise
*/
public boolean isStateful();
/**
* Indicates if the EJB is and MDB
*
* @return True if the bean is an MDB, false otherwise
*/
public boolean isMessageDriven();
/**
* Gets the EJB name
*
* @return The name
*/
public String getEjbName();
}
El EjbDescriptor
es bastante auto explicativo y debería devolver los metadatos pertinentes como se define en la especificación de EJB. Además de estas dos interfaces, está BusinessInterfaceDescriptor
, la cual representa una interfaz de negocios local (encapsulando la clase de interfaz y el nombre de jndi a la búsqueda de una instancia del EJB).
Se le puede pedir a la IR de Web Beans cargar la implementación de EjbDiscovery
mediante la propiedad org.jboss.webbeans.bootstrap.spi.EjbDiscovery
con el nombre completo de la clase calificada como el valor. Por ejemplo:
org.jboss.webbeans.bootstrap.spi.EjbDiscovery=org.jboss.webbeans.integration.jbossas.EjbDiscoveryImpl
Si la IR de Web Beans se utiliza en un contenedor de Servlet, se espera un constructor de la forma:
public EjbDiscoveryImpl(ServletContext servletContext) {}
El contexto de Servlet se puede utilizar para permitir que la implementación de EjbDiscovery
interactúe con el contenedor.
La IR de Web Beans implementa el enlace JNDI y la búsqueda según los estándares, sin embargo si desea puede alterar el enlace y la búsqueda (Por ejemplo en un entorno donde JNDI no está disponible). Para este fin, implemente org.jboss.webbeans.spi.resources.NamingContext
:
public interface NamingContext extends Serializable {
/**
* Typed JNDI lookup
*
* @param <T
> The type
* @param name The JNDI name
* @param expectedType The expected type
* @return The object
*/
public <T
> T lookup(String name, Class<? extends T
> expectedType);
/**
* Binds an item to JNDI
*
* @param name The key to bind under
* @param value The item to bind
*/
public void bind(String name, Object value);
}
y le pide a la IR que lo utilice:
org.jboss.webbeans.resources.spi.NamingContext=com.acme.MyNamingContext
Si la IR de Web Beans se utiliza en un contenedor de Servlet, se espera un constructor de la forma:
public MyNamingContext(ServletContext servletContext) {}
El contexto de Servlet se puede utilizar para permitir que la implementación de NamingContext
interactúe con el contenedor.
La IR de Web Beans necesita cargar clases y recursos desde el classpath en varios momentos. Por defecto, se cargan desde el mismo classloader utilizado para cargar la IR, sin embargo, puede no ser lo apropiado para algunos entornos. Si este es el caso, implemente org.jboss.webbeans.spi.ResourceLoader
:
public interface ResourceLoader {
/**
* Creates a class from a given FQCN
*
* @param name The name of the clsas
* @return The class
*/
public Class<?> classForName(String name);
/**
* Gets a resource as a URL by name
*
* @param name The name of the resource
* @return An URL to the resource
*/
public URL getResource(String name);
/**
* Gets resources as URLs by name
*
* @param name The name of the resource
* @return An iterable reference to the URLS
*/
public Iterable<URL
> getResources(String name);
}
y le pide a la IR que lo utilice:
org.jboss.webbeans.resources.spi.ResourceLoader=com.acme.ResourceLoader
Si la IR de Web Beans se utiliza en un contenedor de Servlet, se espera un constructor de la forma:
public MyResourceLoader(ServletContext servletContext) {}
El contexto de Servlet puede utilizarse para permitir que la implementación de ResourceLoader
interactúe con el contenedor.
Hay una serie de requisitos que la IR de Web Beans ubica en el contenedor para el funcionamiento correcto que está fuera de la implementación de las API.
Si se está integrando la IR de Web Beans dentro de un entorno que admite despliegue de varias aplicaciones, debe habilitar el aislamiento de classloader para cada aplicación de Web Beans, de forma automática o a través de la configuración del usuario.
Si usted está integrando el Web Beans en un entorno de Servlet debe registrar org.jboss.webbeans.servlet.WebBeansListener
como oyente de Servlet, ya sea automáticamente o a través de la configuración de usuario, para cada aplicación Web Beans que utiliza Servlet.
Si está integrando los Web Beans en un entorno EJB debe registrar org.jboss.webbeans.ejb.SessionBeanInterceptor
como un interceptor EJB para todos los EJB en la aplicación, automáticamente o a través de la configuración de usuario, para cada aplicación que utilice Web Beans empresariales.
webbeans-ri.jar
Si está integrando el Web Beans dentro de un entorno que admite despliegue de aplicaciones, debe insertar el webbeans-ri.jar
dentro de las aplicaciones del classloader aislado. No se puede cargar desde el classloader compartido.