Translate

jueves, 26 de mayo de 2011

Introducción a Spring

Voy a intentar explicar de una manera básica cual es el papel de Spring dentro de Alfresco desde el enfoque de sistemas para ayudar a comprender el proceso de configuración y de inicio de Alfresco.

Spring es un framework de J2EE que pretende facilitar la programación y promover las buenas prácticas 

IoC
Estas son las siglas de Inversion de Control, que es un mecanismo muy popular en Spring y que permite mover fuera del código la configuración de objetos y ubicarla en ficheros de configuración. Esto se realiza típicamente a través de ficheros XML.

Se le llama inversión de control porque en lugar de que la clase tome unos valores predeterminados dentro del código lo que hacemos es leer el fichero XML que contiene estos parámetros e instanciará la clase que esté configurada en el Bean con los valores definidos. De esta manera si se quiere cambiar el valor de un parámetro no es necesario recompilar código. Para los más curiosos al final pondré un ejemplo de como se definen estos ficheros.

En Alfresco encontramos el inicio dentro del fichero web.xml

   <!-- Spring Application Context location -->
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/web-application-context.xml</param-value>
      <description>Spring config file location</description>
   </context-param>

El cual hace a su vez un import del fichero application-context.xml
.
.
<import resource="classpath:alfresco/application-context.xml" />
.
.

Es precisamente este fichero el punto de inicio de cualquier aplicación  que usa el framework de Spring, así que en realidad cuando iniciamos el servidor de aplicaciones no estamos arrancando Alfresco en primera instancia, si no que iniciamos Spring y  este mediante la inversión de control y los ficheros de configuración va iniciando todos y cada uno de los servicios de Alfresco.

El classpath alfresco hace referencia al directorio WEB-INF\classes\alfresco y se hace referencia normalmente como configRoot

A partir de este punto se puede ver como se configura Alfresco a través de:

– Referencia in-line a XML
{configRoot}/alfresco/application-context.xml
– Referencias a ficheros XML externos. Incluye la importación de todo el classpath *(:alfresco/extension/*-context.xml
files) mediante el uso de wildcard.
– Referencias a ficheros de propiedades externas.

La ubicación del classpath extension depende del servidor de aplicaciones pero típicamente son :

Tomcat: <TOMCAT_HOME>/shared/classes/alfresco/extension/
Jboss: <JBOSS_HOME>/instancia/conf/alfresco/extension/

Esto proporciona un método de carga de ficheros en 2 fases

  1. classpath://alfresco/*-context.xml
  2. classpath://alfresco/extension/*-context.xml
Se realiza la carga de los ficheros de configuración ubicados en el configRoot y a continuación los ubicados en el directorio extension. En caso de conflicto se toma el último valor cargado. Esto es necesario para poder disponer de un mecanismo de actualización limpio ya que unos ficheros están ubicados dentro del directorio de despliegue y los otros están fuera. Debido a esto no es buena práctica hacer modificaciones dentro del configRoot y se deben hacer en el directorio extension.

Otros ficheros importantes:

- core-services-context.xml: Incluye la definición de beans del nucleo de Alfresco e incluye la importación del fichero repository.properties
- repository.properties: Define las propiedades por defecto que toma alfresco como por ejemplo:

dir.root: define la ubicación del contentstore y de los indices de lucene
db.*: define usuario, contraseña y tipo de base de datos

Vemos entonces que tenemos 2 lugares para realizar nuestra configuración y que además se importan ficheros con wildcards *.
  • En caso de conflicto tenemos que el orden de mayor a menor prioridad es:
    • cambiosJMX persistidos en la BBDD (sólo Enterprise y a partir de la versión 3.2)
    • <extensionRoot>/alfresco/extension/subsystems/<category>/<typeName>/*.properties
    • <extensionRoot>/alfresco/subsystems/<category>/default/*.properties
    • <extensionRoot>/alfresco-global.properties
    • <extensionRoot>/alfresco/module/*/alfresco-global.properties
    • <extensionRoot>/alfresco/repository.properties
Y los últimos y con prioridad más baja serán los ubicados dentro del configRoot.



Los pasos para realizar la inversión de control son bastante sencillos.
  1. Crear la clase Java, definiendo sus constructores y metodos Set() y Get().
  2. Crear un fichero XML que defina los Beans de Java a ser utilizados.
  3. Creación del Bean a través de la BeanFactory.
Vamos a ver un pequeño ejemplo con métodos Set() y Get():

Creamos una clase Java:

public class Ejemplo {

   private String texto

   public void getString(String valor) { texto = valor }
   public void String getString() { return valor }
}

Definimos el Bean de Spring en un fichero xml:

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="mibean" class="Ejemplo">
        <property name="texto">
            <value="Hola Mundo"/>
        </property>
    </bean>
</beans>

Lo que hemos realizado ha sido crear un fichero de configuración de Spring  y a continuación definir el bean "mibean" que instanciará la clase Ejemplo poniendo en la variable texto "Hola Mundo"

Cuando solicitemos a la BeanFactory el bean y solicitemos
mibean.getString() obtendremos la cadena "HolaMundo"

Más información en la Wiki:
http://wiki.alfresco.com/wiki/Repository_Configuration

No hay comentarios:

Publicar un comentario