ApplicationListener beans get obtained on demand, supporting non-singletons as well; ApplicationListeners will be called in the order according to the Ordered contract; generified ApplicationListener interface

This commit is contained in:
Juergen Hoeller
2009-02-09 18:26:30 +00:00
parent 6609386e41
commit 60392d6e74
15 changed files with 338 additions and 220 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 the original author or authors.
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -45,7 +45,7 @@ public abstract class GenericCollectionTypeResolver {
* @param collectionClass the collection class to introspect
* @return the generic type, or <code>null</code> if none
*/
public static Class getCollectionType(Class collectionClass) {
public static Class getCollectionType(Class<? extends Collection> collectionClass) {
return extractTypeFromClass(collectionClass, Collection.class, 0);
}
@@ -55,7 +55,7 @@ public abstract class GenericCollectionTypeResolver {
* @param mapClass the map class to introspect
* @return the generic type, or <code>null</code> if none
*/
public static Class getMapKeyType(Class mapClass) {
public static Class getMapKeyType(Class<? extends Map> mapClass) {
return extractTypeFromClass(mapClass, Map.class, 0);
}
@@ -65,7 +65,7 @@ public abstract class GenericCollectionTypeResolver {
* @param mapClass the map class to introspect
* @return the generic type, or <code>null</code> if none
*/
public static Class getMapValueType(Class mapClass) {
public static Class getMapValueType(Class<? extends Map> mapClass) {
return extractTypeFromClass(mapClass, Map.class, 1);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 the original author or authors.
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -99,6 +99,18 @@ public abstract class GenericTypeResolver {
return (rawType instanceof Class ? (Class) rawType : method.getReturnType());
}
/**
* Resolve the given type variable against the given class.
* @param tv the type variable to resolve
* @param clazz the class that defines the type variable
* somewhere in its inheritance hierarchy
* @return the resolved type that the variable can get replaced with,
* or <code>null</code> if none found
*/
public static Type resolveTypeVariable(TypeVariable tv, Class clazz) {
return getTypeVariableMap(clazz).get(tv);
}
/**
* Resolve the specified generic type against the given TypeVariable map.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2007 the original author or authors.
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -51,18 +51,13 @@ public interface Ordered {
/**
* Return the order value of this object, with a
* higher value meaning greater in terms of sorting.
* <p>Normally starting with 0 or 1, with {@link #LOWEST_PRECEDENCE}
* indicating greatest. Same order values will result in arbitrary
* positions for the affected objects.
* <p>Higher value can be interpreted as lower priority,
* consequently the first object has highest priority
* <p>Normally starting with 0, with <code>Integer.MAX_VALUE</code>
* indicating the greatest value. Same order values will result
* in arbitrary positions for the affected objects.
* <p>Higher values can be interpreted as lower priority. As a
* consequence, the object with the lowest value has highest priority
* (somewhat analogous to Servlet "load-on-startup" values).
* <p>Note that order values below 0 are reserved for framework
* purposes. Application-specified values should always be 0 or
* greater, with only framework components (internal or third-party)
* supposed to use lower values.
* @return the order value
* @see #LOWEST_PRECEDENCE
*/
int getOrder();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2006 the original author or authors.
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@ package org.springframework.core;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -101,12 +102,22 @@ public class GenericCollectionTypeResolverTests extends AbstractGenericsTests {
GenericCollectionTypeResolver.getCollectionReturnType(getter));
}
private abstract class CustomMap <T> extends AbstractMap<String, Integer> {
public void testClassResolution() {
assertEquals(String.class, GenericCollectionTypeResolver.getCollectionType(CustomSet.class));
assertEquals(String.class, GenericCollectionTypeResolver.getMapKeyType(CustomMap.class));
assertEquals(Integer.class, GenericCollectionTypeResolver.getMapValueType(CustomMap.class));
}
private abstract class OtherCustomMap <T> implements Map<String, Integer> {
private abstract class CustomSet<T> extends AbstractSet<String> {
}
private abstract class CustomMap<T> extends AbstractMap<String, Integer> {
}
private abstract class OtherCustomMap<T> implements Map<String, Integer> {
}