2010-03-18 13 views
5

me han comentado mis clases con @Repository, @Resource, @Component, anotaciones @Service pero estas clases se tienen que ejecutar en 2 ambientes. El primer entorno está basado en Spring 2.x mientras que el otro no tiene ningún resorte. Estoy seguro de que el código fallará sin los jarras de resorte & Quiero saber sus ideas sobre cómo puedo conservar las anotaciones pero aún así trabajar en ambos entornosLa dependencia de las anotaciones de la primavera

Respuesta

0

Como no se puede eliminar un mensaje aceptado, le sugiero que lea poste/voto Hans', que es una explicación mucho mejor que mi original: Dependency on Spring's annotations


Al utilizar las anotaciones de estereotipo (@Service etc.), la compensación para obtener la validación del bean en tiempo de compilación es que usted se acopla a la biblioteca de contexto de primavera en su código. Veo 3 opciones inmediatas:

1) Eliminar las anotaciones, y configurar sus granos en XML.

2) Copie spring-context.jar (o la biblioteca equivalente que contiene las anotaciones de estereotipo) en su proyecto que no sea Spring para resolver las dependencias, pero deje Spring sin configurar para que no se use en su código.

3) Retire las anotaciones de sus clases concretas, y se extienden por versiones de "Primavera". Este enfoque puede o no puede ser un poco invasivo para su diseño, pero vale la pena considerar:

public class MyDAO { 
    protected SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    // .. Your DAO code resides here .. 
} 

y el muelle de sub-clase:

@Repository 
public class MySpringDAO extends MyDAO { 

    @AutoWired 
    protected SessionFactory sessionFactory; 
} 

De esta manera, su proyecto no primavera puede utilizar " MyDAO ", y excluir la clase" MySpringDAO "de la compilación.

+0

Elegí # 2 y funciona bien. –

+0

Gracias Sean, es muy amable de tu parte. –

1

Para cada anotación en Java, hay un archivo de clase correspondiente. Si averigua qué anotaciones usa, puede copiar los archivos de clase en el otro entorno.

No estoy seguro de si estas clases dependen de otras clases aswel; probablemente no lo sean, ya que las anotaciones son objetos de datos inmutables. Si la clase también tiene métodos, puede volver a compilar (con la misma ID de serialización) las fuentes de anotación sin los métodos (es decir, solo los campos) para usar en el otro entorno.

5

Para poder usar las anotaciones que menciona, o realmente, deje que Spring las use por usted para que obtenga el beneficio, necesita usar al menos Spring 2.5.x, es cuando se introdujeron.

Además, no es necesario que las anotaciones estén en el classpath. Simplemente serán ignorados. Ya que cuando está utilizando la primavera 2.0 no habrá ningún código que intente 'escanear' en busca de ellos.

+0

Aún tiene dependencias de tiempo de compilación en esas anotaciones. Y dado que sus archivos .class tienen las anotaciones compiladas, supongo que también necesitaría los archivos '.class de anotaciones en su ruta de clase. ¿No es ese el caso? –

+1

Nope :) para verificarlo Acabo de probar. Creé un proyecto pequeño, con un main(). La clase está anotada con MyAnnotation que escribí. Lo ejecuté en la línea de comandos, luego eliminé manualmente el archivo .class para la anotación y lo ejecuté de nuevo. Aún funcionó. Pruébelo usted mismo :) Tenga en cuenta que mi anotación fue anotada en sí misma con @Retention (RetentionPolicy.RUNTIME) –

+0

Muy bueno saber de hecho ... –

0

No sería primavera si te obligara a hacer que tus clases dependieran directamente de ella.

Puede definir sus propias anotaciones que sirvan para el mismo propósito que las probadas en primavera. Es decir. definir com.yourcompany .... etc Componente

Asumo que utilice un <context:component-scan .../> en algún lugar de su configuración primavera. Simplemente agregue use-default-filters="false" y defina su propio filtro para que coincida con sus anotaciones.

Busque los posprocesadores que realmente hacen el trabajo pesado.Se pueden configurar para utilizar un conjunto alternativo de anotaciones. @Repository es examinado por PersistenceExceptionTranslationPostProcessor. Este PostProcessor se puede configurar para usar su equivalente a la anotación.

Cuestiones relacionadas