EntityResolver的实现类
友情提示:下面的代码可能很多,会劝退一些人,大家只要着重看我注释的地方就可以,因为如果看源码,要深究每一行代码,那么几乎就无法完成了,需要的是理解spring的思路以及重点的地方。
- ResourceEntityResolver
- DelegatingEntityResolver
共有两个实现类,而ResourceEntityResolver继承了DelegatingEntityResolver类,并重写了resolveEntity方法。
ResourceEntityResolver的resolveEntity方法代码如下:
public InputSource resolveEntity(@Nullable String publicId, @Nullable String systemId) throws SAXException, IOException {
// 这里的super.resolveEntity(DelegatingEntityResolver)方法划重点,这也是本类的最终作用,由于验证XML文件正常需要通过网络去访问网址,不理解的可以去搜索一下哈,很简单的,这里不再阐述,由于网络等原因带来的不良好体验,所以Spring建立了如图1.1的文件供验证使用
InputSource source = super.resolveEntity(publicId, systemId);
// 下面的代码块我认为是,由于spring为了预防加载失败时,使用网络的方式进行验证,有兴趣同学可以看一下。
if (source == null && systemId != null) {
String resourcePath = null;
String url;
try {
url = URLDecoder.decode(systemId, "UTF-8");
String givenUrl = (new URL(url)).toString();
String systemRootUrl = (new File("")).toURI().toURL().toString();
if (givenUrl.startsWith(systemRootUrl)) {
resourcePath = givenUrl.substring(systemRootUrl.length());
}
} catch (Exception var9) {
if (logger.isDebugEnabled()) {
logger.debug("Could not resolve XML entity [" + systemId + "] against system root URL"