2010-12-30 13 views
12
@Service @Order(1) 
public class FooService implements IService {..} 

@Service @Order(2) 
public class BarService implements IService {..} 

¿Es garantizado que el orden en la lista siguiente será siempre {FooService, BarService}:Cuando se inyecta una lista de los granos, es el orden en la lista el mismo que el orden definido de los granos

@Inject 
private List<IService> services; 

(la misma pregunta vale para xml config)

+1

simplemente he intentado trazar esto a través de la primavera código fuente, pero es bastante aterrador, y no puedo seguirlo lo suficiente. Sospecho que la respuesta es "sí", sin embargo. – skaffman

+0

@skaffman Siendo este el comportamiento más lógico, y dada la "política" habitual de la primavera sobre ese asunto, también sospecho que "sí". Pero intentaré encontrar una prueba :) – Bozho

+0

@skaffman - parece que nuestras expectativas son erróneas;) (ver la respuesta de axtavt y los comentarios a continuación) – Bozho

Respuesta

11

Supongo que no porque @Order no es una anotación de propósito general. De javadoc:

NOTA: El orden basado en anotaciones solo se admite para tipos específicos de componentes, p. para aspectos de AspectJ basados ​​en anotaciones. Las estrategias de contenedor de resorte, por otro lado, se basan típicamente en la interfaz ordenada para permitir el ordenamiento configurable de cada instancia.

También no hay ocurrencias de org.springframework.core.annotation.Order y AnnotationAwareOrderComparator en la fuente de beans y context módulos.

Una forma sencilla de hacer esto comporta como se esperaba es:

@PostConstruct 
public void init() { 
    Collections.sort(services, AnnotationAwareOrderComparator.INSTANCE); 
} 
+0

Y entonces, si en cambio implemento 'Ordered', lo harán estar ordenado correctamente en la lista? – Bozho

+0

@Bozho: Creo que 'Ordered' no puede ayudar también, parece que' OrderComparator' se usa solo para pedir beans especiales, como post procesadores. – axtavt

+0

Lo probó, y la prueba demostró que era correcto. Aceptó la respuesta y le agregó una solución alternativa (si no está de acuerdo, puede quitarla :)). – Bozho

3

Desde el lanzamiento de la primavera 4, el uso de @Order se ha ampliado para incluir @Component

Cuestiones relacionadas