/*
 * Copyright 2002-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
 *
 *      https://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.context.support;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

AbstractRefreshableApplicationContext subclass that adds common handling of specified config locations. Serves as base class for XML-based application context implementations such as ClassPathXmlApplicationContext and FileSystemXmlApplicationContext, as well as XmlWebApplicationContext.
Author:Juergen Hoeller
See Also:
Since:2.5.2
/** * {@link AbstractRefreshableApplicationContext} subclass that adds common handling * of specified config locations. Serves as base class for XML-based application * context implementations such as {@link ClassPathXmlApplicationContext} and * {@link FileSystemXmlApplicationContext}, as well as * {@link org.springframework.web.context.support.XmlWebApplicationContext}. * * @author Juergen Hoeller * @since 2.5.2 * @see #setConfigLocation * @see #setConfigLocations * @see #getDefaultConfigLocations */
public abstract class AbstractRefreshableConfigApplicationContext extends AbstractRefreshableApplicationContext implements BeanNameAware, InitializingBean { @Nullable private String[] configLocations; private boolean setIdCalled = false;
Create a new AbstractRefreshableConfigApplicationContext with no parent.
/** * Create a new AbstractRefreshableConfigApplicationContext with no parent. */
public AbstractRefreshableConfigApplicationContext() { }
Create a new AbstractRefreshableConfigApplicationContext with the given parent context.
Params:
  • parent – the parent context
/** * Create a new AbstractRefreshableConfigApplicationContext with the given parent context. * @param parent the parent context */
public AbstractRefreshableConfigApplicationContext(@Nullable ApplicationContext parent) { super(parent); }
Set the config locations for this application context in init-param style, i.e. with distinct locations separated by commas, semicolons or whitespace.

If not set, the implementation may use a default as appropriate.

/** * Set the config locations for this application context in init-param style, * i.e. with distinct locations separated by commas, semicolons or whitespace. * <p>If not set, the implementation may use a default as appropriate. */
public void setConfigLocation(String location) { setConfigLocations(StringUtils.tokenizeToStringArray(location, CONFIG_LOCATION_DELIMITERS)); }
Set the config locations for this application context.

If not set, the implementation may use a default as appropriate.

/** * Set the config locations for this application context. * <p>If not set, the implementation may use a default as appropriate. */
public void setConfigLocations(@Nullable String... locations) { if (locations != null) { Assert.noNullElements(locations, "Config locations must not be null"); this.configLocations = new String[locations.length]; for (int i = 0; i < locations.length; i++) { this.configLocations[i] = resolvePath(locations[i]).trim(); } } else { this.configLocations = null; } }
Return an array of resource locations, referring to the XML bean definition files that this context should be built with. Can also include location patterns, which will get resolved via a ResourcePatternResolver.

The default implementation returns null. Subclasses can override this to provide a set of resource locations to load bean definitions from.

See Also:
Returns:an array of resource locations, or null if none
/** * Return an array of resource locations, referring to the XML bean definition * files that this context should be built with. Can also include location * patterns, which will get resolved via a ResourcePatternResolver. * <p>The default implementation returns {@code null}. Subclasses can override * this to provide a set of resource locations to load bean definitions from. * @return an array of resource locations, or {@code null} if none * @see #getResources * @see #getResourcePatternResolver */
@Nullable protected String[] getConfigLocations() { return (this.configLocations != null ? this.configLocations : getDefaultConfigLocations()); }
Return the default config locations to use, for the case where no explicit config locations have been specified.

The default implementation returns null, requiring explicit config locations.

See Also:
Returns:an array of default config locations, if any
/** * Return the default config locations to use, for the case where no * explicit config locations have been specified. * <p>The default implementation returns {@code null}, * requiring explicit config locations. * @return an array of default config locations, if any * @see #setConfigLocations */
@Nullable protected String[] getDefaultConfigLocations() { return null; }
Resolve the given path, replacing placeholders with corresponding environment property values if necessary. Applied to config locations.
Params:
  • path – the original file path
See Also:
Returns:the resolved file path
/** * Resolve the given path, replacing placeholders with corresponding * environment property values if necessary. Applied to config locations. * @param path the original file path * @return the resolved file path * @see org.springframework.core.env.Environment#resolveRequiredPlaceholders(String) */
protected String resolvePath(String path) { return getEnvironment().resolveRequiredPlaceholders(path); } @Override public void setId(String id) { super.setId(id); this.setIdCalled = true; }
Sets the id of this context to the bean name by default, for cases where the context instance is itself defined as a bean.
/** * Sets the id of this context to the bean name by default, * for cases where the context instance is itself defined as a bean. */
@Override public void setBeanName(String name) { if (!this.setIdCalled) { super.setId(name); setDisplayName("ApplicationContext '" + name + "'"); } }
Triggers AbstractApplicationContext.refresh() if not refreshed in the concrete context's constructor already.
/** * Triggers {@link #refresh()} if not refreshed in the concrete context's * constructor already. */
@Override public void afterPropertiesSet() { if (!isActive()) { refresh(); } } }