martes, diciembre 05, 2006

Nuevo tipo de configuración basado en anotaciones para Spring


Como ya saben, hay una nueva forma de configurar Spring. XML es el tipo de configuración mas utilizada para Spring, pero con este nuevo tipo, basado en anotaciones, podemos cambiar algo del "infierno xml". Dejaremos en paz la configuración mediante Groovy, al menos por ahora.
Los desarrolladores por ejemplo, pueden utilizar esto para alguna forma de configuración interna, dejando la configuración xml para infraestructura.
Pueden mirar en la web del proyecto las novedades, pero imaginen un xml como este:

<beans>
<bean id="myCompany" class="package.Company"/>
<bean id="employee" class="Employee" scope="prototype">
<property name="company" ref="myCompany"/>
</bean>
</beans>

podría hacerse así:

@Configuration
public class AppConfiguration {
@Bean
public Company myCompany() {
return new Company();
}

@Bean(scope = Scope.PROTOTYPE)
public Employee employee() {
Employee employee = new Employee();
employee.setCompany(myCompany());
return employee;
}
}

iniciando mas tarde un ApplicationContext con un bean ConfigurationPostProcessor, pudiendo incluso mezclar beans de ambos métodos:

<beans>
<bean class="package.AppConfiguration"/>
<bean class="org.springframework.beans.factory.java.ConfigurationPostProcessor"/>
<bean class="package.OtherClass">
<property name="employee" ref="employee"/>
</bean>
</beans>

Rod también nos muestra un nuevo application context (por Costin Leau):

ApplicationContext oneConfig =
new AnnotationApplicationContext(SimpleConfiguration.class.getName());

y

ApplicationContext aBunchOfConfigs =
new AnnotationApplicationContext("**/configuration/*Configuration.class");

Dejaremos a nuestra imaginación una forma de configuración mas dinámica todavía, mezclando loops y if/thens en el bean de configuración!
El código puede ser encontrado aquí. Que lo disfruten!

jueves, noviembre 30, 2006

Nuevo namespace en Spring 2.0


Una forma mas bien rara de configurar los beans de Spring parece ser la que Rod Johnson nos recuerda en una entrada de su blog.
Básicamente se puede utilizar un nuevo namespace "p" para utilizar los atributos de un XML como propiedades de los beans.
Lo que normalmente haríamos así:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="empleado" class="package.Empleado">
<property name="empresa" ref="empresa" />
<property name="horasSemanales" value="35" />
</bean>

<bean id="empresa" class="package.Empresa" />

</beans>
Lo podríamos hacer así:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="empleado" class="package.Empleado"
p:direccion-ref="empresa"
p:horasSemanales="35" />

<bean id="empresa" class="package.Empresa" />

</beans>
Un pequeño cambio que podría hacer nuestros XMLs mas compactos, aunque no se si mas legibles.

Mas ejemplos aquí.

lunes, noviembre 27, 2006

Compartir URLs


Aprovechando que es Lunes (quiero quejarme de algo) y que ya lo he leído por ahí, quiero apoyar una idea:
Sería hora que alguien pusiera orden al infierno de compartir URLs. Lo que aparece normalmente en los artículos () no es sostenible. Que cada web para compartir vínculos tengo su propia forma de hacerlo es muy del siglo pasado. No digo de llegar al extremo de hacer una JSR para ello, pero algún orden no vendría mal.

miércoles, noviembre 22, 2006

Java web frameworks - Cuál elegir?


Si hay algo imposible en estos días (y desde hace tiempo) es elegir un framework web en Java. Es mas cuestión de gusto que de tecnología. Y eso molesta. Hace que la competencia (léase .NET) sean mucho mas fáciles de adoptar. Cuáles de ellos hay que seguir día a día para ver como avanzan? En mi opinión:

  • Shale Basado en JavaServer Faces.
  • Wicket Modelado web... en java.
  • Stripes MVC clásico, pero con casi cero configuración.
  • Seam Basado en EJB 3.0 y un poco pegado a productos JBOSS.


Update: Con el nuevo Seam 1.1 se pueden utilizar POJOs fuera de un servidor EJB 5.0. Incluso con Tomcat.

lunes, noviembre 20, 2006

Tecnologías con las que me gustaría trabajar (I)


Una de las tecnologías con las que me gustaría hacer algo productivo (léase: encontrar un cliente que me pague por hacer una aplicación) es JCR (Java Content Repository).
La JSR-170 especifica la forma en la que deberíamos comunicarnos con los repositorios de contenido. Los repositorios de contenido o "Content Management Systems" (CMS) como Documentum o Vignette nos permiten guardar información binaria o de texto sin tener que preocuparnos por dónde se hace, es decir si se utiliza una base de datos relacional o ficheros XML. Pero cada vendedor tiene su propio producto y su propia forma de acceder a la información, por lo que la JSR-170 trata de resolver el problema de la estandarización.
En el mundo open source, Apache JackRabbit es la implementación de referencia.
La información es organizada en nodos de un árbol, teniendo cada nodo "atributos" o "propiedades" donde guardar los datos. Por ejemplo, para guardar información podríamos (ejemplo tomado de aquí):

Session session = JackrabbitPlugin.getSession();
Node rootNode = session.getRootNode();
Node blogEntry = rootNode.addNode("blogEntry");
blogEntry.addMixin("mix:versionable");
blogEntry.setProperty(PROP_TITLE, blogEntryDTO.getTitle());
blogEntry.setProperty(PROP_BLOGCONTENT, blogEntryDTO.getBlogContent());
blogEntry.setProperty(PROP_CREATIONTIME, blogEntryDTO.getCreationTime());
blogEntry.setProperty(PROP_BLOGAUTHOR, blogEntryDTO.getUserName());
session.save();

Con lo que lograríamos crear un nodo, hacerlo versionable (uno de los servicios de la JSR), llenarlo con nuestra información y guardarlo.

Nunca se sabe, quizás en un futuro próximo convenza a alguien para utilizar Jackrabbit. Deséenme suerte!

domingo, noviembre 19, 2006

Pico y Spring


PicoContainer, alguien se acuerda de él? Es un contenedor de componentes que utiliza inyección de dependencias. Pero fue avasallado por el huracán Spring, aunque sigue teniendo sus adeptos incondicionales.
Y tan incondicionales que a veces (como otras tecnologías) se utiliza simplemente porque "es lo que sé", dejando de lado las "que no se" pero nos da mucha mas funcionalidad a nuestra arquitectura.
Pero como nada en esta vida es permanente (ni siquiera si utilizamos hibernate), y todo llega (incluso Java como open source), mi amigo Ale pudo finalmente "refactorizar" una aplicación para cambiar Pico por... Spring.

lunes, octubre 23, 2006

Un poco de Subversion en mi vida...

Emulando a algún blog por ahí, dejaré aquí los pasos necesarios al inicio de un proyecto para crear un repositorio en subversion.

  • Crear el repositorio
    svnadmin create c:\test\repo
  • Editar los ficheros "svnserve.conf" y "passwd"

    svnserve.conf:
    [general]
    anon-access = read
    auth-access = write
    password-db = passwd

    [miscellany]
    enable-auto-props = yes

    [auto-props]
    *.java = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.jsp = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.css = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.htm = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.html = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.xml = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.xsl = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.dtd = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.txt = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.properties = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.tld = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL

    passwd:
    [users]
    admin=admin

  • Crear los directorios de proyecto iniciales
    svn mkdir file:///c:/test/repo/MyProject -m "starting..."
    svn list file:///c:/test/repo

    svn mkdir file:///c:/test/repo/MyProject/trunk -m "starting..."
    svn list file:///c:/test/repo/MyProject

    svnlook tree c:/test/repo --show-ids

  • Importar los ficheros iniciales (seguro que a esta altura ya hay alguno)
    svn import C:/test/workspace/upmng file:///c:/test/repo/MyProject/trunk -m "test"