spring源码之Resource资源读取

想必接触过spring的朋友都应该写过大量的配置文件吧。那么java是如何读取配置文件的呢?
以下是Resource的源码:

public interface Resource extends InputStreamSource {
	//存在性
   boolean exists();
   
	//可读性
   default boolean isReadable() {
      return exists();
   }
   
	//是否处于打开状态
   default boolean isOpen() {
      return false;
   }

	//是否是文件
   default boolean isFile() {
      return false;
   }
   
	//URL资源
   URL getURL() throws IOException;
	
	//URI资源
   URI getURI() throws IOException;
   
	//file文件
   File getFile() throws IOException;
   
	//读取byte
   default ReadableByteChannel readableChannel() throws IOException {
      return Channels.newChannel(getInputStream());
   }
   
   long contentLength() throws IOException;

   long lastModified() throws IOException;
   
	//根据相对路径获取资源
   Resource createRelative(String relativePath) throws IOException;

   @Nullable
   //文件名
   String getFilename();

   String getDescription();
}

Resource继承自InputStreamSource,在InputStreamSource只定义了一个方法
spring源码之Resource资源读取_第1张图片

InputStreamSource封装了任何能返回InputStream的类,比如file,classpath下的资源以及ByteArray等。
对于不同的来源的资源文件都有想对应的Resource实现。最常用的就比如ClassPath资源(ClassPathResource),file资源(FileSystemResource),URL资源(UrlResource),Byte数组(ByteArrayResource)等等。

有了Resource接口便可以对所有的资源文件进行统一处理。
如下:通过ClassPathResource读取根目录下的spring.xml,通过XmlBeanFactoryXmlBeanFactory的构造函数间的调用,将Resource交由XmlBeanDefinitionReader对配置文件进行读取。spring源码之Resource资源读取_第2张图片

public class XmlBeanFactory extends DefaultListableBeanFactory {
	private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
	public XmlBeanFactory(Resource resource) throws BeansException {
		this(resource, null);
	}
	public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
		super(parentBeanFactory);
		//配置文件真正读取的方法。
		this.reader.loadBeanDefinitions(resource);
	}
}

以上便是我所理解的配置文件的读取,部分内容来自spring源码深度解析这本书。

你可能感兴趣的:(spring源码)