|
|
|
@ -49,64 +49,71 @@ public class EnvironmentDelegateApplicationContextInitializer implements |
|
|
|
private int order = 0; |
|
|
|
private int order = 0; |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void initialize(ConfigurableApplicationContext applicationContext) { |
|
|
|
public void initialize(ConfigurableApplicationContext context) { |
|
|
|
ConfigurableEnvironment env = applicationContext.getEnvironment(); |
|
|
|
ConfigurableEnvironment environment = context.getEnvironment(); |
|
|
|
List<Class<ApplicationContextInitializer<ConfigurableApplicationContext>>> initializerClasses = determineContextInitializerClasses(env); |
|
|
|
List<Class<?>> initializerClasses = getInitializerClasses(environment); |
|
|
|
|
|
|
|
if (initializerClasses.size() > 0) { |
|
|
|
if (initializerClasses.size() == 0) { |
|
|
|
applyInitializerClasses(context, initializerClasses); |
|
|
|
// no ApplicationContextInitializers have been declared -> nothing to do
|
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Class<?> contextClass = applicationContext.getClass(); |
|
|
|
|
|
|
|
ArrayList<ApplicationContextInitializer<ConfigurableApplicationContext>> initializerInstances = new ArrayList<ApplicationContextInitializer<ConfigurableApplicationContext>>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (Class<ApplicationContextInitializer<ConfigurableApplicationContext>> initializerClass : initializerClasses) { |
|
|
|
|
|
|
|
Class<?> initializerContextClass = GenericTypeResolver.resolveTypeArgument( |
|
|
|
|
|
|
|
initializerClass, ApplicationContextInitializer.class); |
|
|
|
|
|
|
|
Assert.isAssignable( |
|
|
|
|
|
|
|
initializerContextClass, |
|
|
|
|
|
|
|
contextClass, |
|
|
|
|
|
|
|
String.format( |
|
|
|
|
|
|
|
"Could not add context initializer [%s] as its generic parameter [%s] " |
|
|
|
|
|
|
|
+ "is not assignable from the type of application context used by this " |
|
|
|
|
|
|
|
+ "context loader [%s]: ", |
|
|
|
|
|
|
|
initializerClass.getName(), |
|
|
|
|
|
|
|
initializerContextClass.getName(), contextClass.getName())); |
|
|
|
|
|
|
|
initializerInstances.add(BeanUtils.instantiateClass(initializerClass)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Collections.sort(initializerInstances, new AnnotationAwareOrderComparator()); |
|
|
|
|
|
|
|
for (ApplicationContextInitializer<ConfigurableApplicationContext> initializer : initializerInstances) { |
|
|
|
|
|
|
|
initializer.initialize(applicationContext); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
private List<Class<?>> getInitializerClasses(ConfigurableEnvironment env) { |
|
|
|
private List<Class<ApplicationContextInitializer<ConfigurableApplicationContext>>> determineContextInitializerClasses( |
|
|
|
|
|
|
|
ConfigurableEnvironment env) { |
|
|
|
|
|
|
|
String classNames = env.getProperty(PROPERTY_NAME); |
|
|
|
String classNames = env.getProperty(PROPERTY_NAME); |
|
|
|
List<Class<ApplicationContextInitializer<ConfigurableApplicationContext>>> classes = new ArrayList<Class<ApplicationContextInitializer<ConfigurableApplicationContext>>>(); |
|
|
|
List<Class<?>> classes = new ArrayList<Class<?>>(); |
|
|
|
if (StringUtils.hasLength(classNames)) { |
|
|
|
if (StringUtils.hasLength(classNames)) { |
|
|
|
for (String className : StringUtils.tokenizeToStringArray(classNames, ",")) { |
|
|
|
for (String className : StringUtils.tokenizeToStringArray(classNames, ",")) { |
|
|
|
try { |
|
|
|
classes.add(getInitializerClass(className)); |
|
|
|
Class<?> clazz = ClassUtils.forName(className, |
|
|
|
|
|
|
|
ClassUtils.getDefaultClassLoader()); |
|
|
|
|
|
|
|
Assert.isAssignable(ApplicationContextInitializer.class, clazz, |
|
|
|
|
|
|
|
"class [" + className |
|
|
|
|
|
|
|
+ "] must implement ApplicationContextInitializer"); |
|
|
|
|
|
|
|
classes.add((Class<ApplicationContextInitializer<ConfigurableApplicationContext>>) clazz); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (ClassNotFoundException ex) { |
|
|
|
|
|
|
|
throw new ApplicationContextException( |
|
|
|
|
|
|
|
"Failed to load context initializer class [" + className |
|
|
|
|
|
|
|
+ "]", ex); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return classes; |
|
|
|
return classes; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Class<?> getInitializerClass(String className) throws LinkageError { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
Class<?> initializerClass = ClassUtils.forName(className, |
|
|
|
|
|
|
|
ClassUtils.getDefaultClassLoader()); |
|
|
|
|
|
|
|
Assert.isAssignable(ApplicationContextInitializer.class, initializerClass); |
|
|
|
|
|
|
|
return initializerClass; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (ClassNotFoundException ex) { |
|
|
|
|
|
|
|
throw new ApplicationContextException( |
|
|
|
|
|
|
|
"Failed to load context initializer class [" + className + "]", ex); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void applyInitializerClasses(ConfigurableApplicationContext context, |
|
|
|
|
|
|
|
List<Class<?>> initializerClasses) { |
|
|
|
|
|
|
|
Class<?> contextClass = context.getClass(); |
|
|
|
|
|
|
|
List<ApplicationContextInitializer<?>> initializers = new ArrayList<ApplicationContextInitializer<?>>(); |
|
|
|
|
|
|
|
for (Class<?> initializerClass : initializerClasses) { |
|
|
|
|
|
|
|
initializers.add(instantiateInitializer(contextClass, initializerClass)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
applyInitializers(context, initializers); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private ApplicationContextInitializer<?> instantiateInitializer( |
|
|
|
|
|
|
|
Class<?> contextClass, Class<?> initializerClass) { |
|
|
|
|
|
|
|
Class<?> requireContextClass = GenericTypeResolver.resolveTypeArgument( |
|
|
|
|
|
|
|
initializerClass, ApplicationContextInitializer.class); |
|
|
|
|
|
|
|
Assert.isAssignable(requireContextClass, contextClass, String.format( |
|
|
|
|
|
|
|
"Could not add context initializer [%s]" |
|
|
|
|
|
|
|
+ " as its generic parameter [%s] is not assignable " |
|
|
|
|
|
|
|
+ "from the type of application context used by this " |
|
|
|
|
|
|
|
+ "context loader [%s]: ", initializerClass.getName(), |
|
|
|
|
|
|
|
requireContextClass.getName(), contextClass.getName())); |
|
|
|
|
|
|
|
return (ApplicationContextInitializer<?>) BeanUtils |
|
|
|
|
|
|
|
.instantiateClass(initializerClass); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings({ "unchecked", "rawtypes" }) |
|
|
|
|
|
|
|
private void applyInitializers(ConfigurableApplicationContext context, |
|
|
|
|
|
|
|
List<ApplicationContextInitializer<?>> initializers) { |
|
|
|
|
|
|
|
Collections.sort(initializers, new AnnotationAwareOrderComparator()); |
|
|
|
|
|
|
|
for (ApplicationContextInitializer initializer : initializers) { |
|
|
|
|
|
|
|
initializer.initialize(context); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setOrder(int order) { |
|
|
|
public void setOrder(int order) { |
|
|
|
this.order = order; |
|
|
|
this.order = order; |
|
|
|
} |
|
|
|
} |
|
|
|
|