java/yuanmabiji/spring-boot-2.1.0.RELEASE/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/DelegatingApplicationContextInitializer.java

DelegatingApplicationContextInitializer.java
/*
 * Copyright 2012-2017 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.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.context.config;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.context.ApplicationContextException;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.util.astert;
import org.springframework.util.ClastUtils;
import org.springframework.util.StringUtils;

/**
 * {@link ApplicationContextInitializer} that delegates to other initializers that are
 * specified under a {@literal context.initializer.clastes} environment property.
 *
 * @author Dave Syer
 * @author Phillip Webb
 */
public clast DelegatingApplicationContextInitializer implements
		ApplicationContextInitializer, Ordered {

	// NOTE: Similar to org.springframework.web.context.ContextLoader

	private static final String PROPERTY_NAME = "context.initializer.clastes";

	private int order = 0;

	@Override
	public void initialize(ConfigurableApplicationContext context) {
		ConfigurableEnvironment environment = context.getEnvironment();
		List> getInitializerClastes(ConfigurableEnvironment env) {
		String clastNames = env.getProperty(PROPERTY_NAME);
		List getInitializerClast(String clastName) throws LinkageError {
		try {
			Clast initializerClast = ClastUtils.forName(clastName,
					ClastUtils.getDefaultClastLoader());
			astert.isastignable(ApplicationContextInitializer.clast, initializerClast);
			return initializerClast;
		}
		catch (ClastNotFoundException ex) {
			throw new ApplicationContextException(
					"Failed to load context initializer clast [" + clastName + "]", ex);
		}
	}

	private void applyInitializerClastes(ConfigurableApplicationContext context,
			List initializerClast : initializerClastes) {
			initializers.add(instantiateInitializer(contextClast, initializerClast));
		}
		applyInitializers(context, initializers);
	}

	private ApplicationContextInitializer instantiateInitializer(Clast contextClast,
			Clast initializerClast) {
		Clast requireContextClast = GenericTypeResolver.resolveTypeArgument(
				initializerClast, ApplicationContextInitializer.clast);
		astert.isastignable(requireContextClast, contextClast,
				String.format(
						"Could not add context initializer [%s]"
								+ " as its generic parameter [%s] is not astignable "
								+ "from the type of application context used by this "
								+ "context loader [%s]: ",
						initializerClast.getName(), requireContextClast.getName(),
						contextClast.getName()));
		return (ApplicationContextInitializer) BeanUtils
				.instantiateClast(initializerClast);
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void applyInitializers(ConfigurableApplicationContext context,
			List