关于@PropertySources注解的理解:http://www.imooc.com/article/252889?block_id=tuijian_wz
public interface PropertySources extends Iterable> { /** * Return a sequential {@link Stream} containing the property sources. * @since 5.1 */ default Stream > stream() { return StreamSupport.stream(spliterator(), false); } /** * Return whether a property source with the given name is contained. * @param name the {@linkplain PropertySource#getName() name of the property source} to find */ boolean contains(String name); /** * Return the property source with the given name, {@code null} if not found. * @param name the {@linkplain PropertySource#getName() name of the property source} to find */ @Nullable PropertySource get(String name);这就是PropertySources的接口,那么它的实现类在哪里?是MutablePropertySources,}
PropertySources是由工厂类生成的,看看DefaultPropertySourceFactory
public class DefaultPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource createPropertySource(@Nullable String name, EncodedResource resource) throws IOException { return (name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource)); }}
然后又调用ResourcePropertySource类,在该类下,实现了对配置文件的加载loadProperties(resource).
public class ResourcePropertySource extends PropertiesPropertySource { /** The original resource name, if different from the given name. */ @Nullable private final String resourceName; /** * Create a PropertySource having the given name based on Properties * loaded from the given encoded resource. */ public ResourcePropertySource(String name, EncodedResource resource) throws IOException { super(name, PropertiesLoaderUtils.loadProperties(resource)); this.resourceName = getNameForResource(resource.getResource()); }
剩下的就是java的文件的加载过程,细节就不再讨论了