(解答)SpringBoot从2.1.X过渡到2.2.X后,网站图标favicon.ico去哪了?
故事发生背景:
在学习springboot源码的过程中,阅读到自动配置webmvc静态资源的时候,发现favicon.ico代码块改动过了,于是想办法把它找出来。
在2.1.X版本中,springboot jar包中还是会默认携带一个存放于resources文件夹下的favicon.ico文件。并且把这个ico文件添加到了静态资源路径下。需要注意的是,他是写死了作为网站图标的文件名的,不可更改。代码块如下:
WebMvcAutoConfiguration类下的。我们可以看到如果不配置这个条件属性的话,我们的项目会默认去静态资源路径下寻找这个ico文件并显示。
如果想要关闭的话,就在我们的application.properties或者yml文件下,配置spring.mvc.favicon.enabled=false即可。
@Configuration
@ConditionalOnProperty(value = "spring.mvc.favicon.enabled", matchIfMissing = true)
public static class FaviconConfiguration implements ResourceLoaderAware {
private final ResourceProperties resourceProperties;
private ResourceLoader resourceLoader;
public FaviconConfiguration(ResourceProperties resourceProperties) {
this.resourceProperties = resourceProperties;
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Bean
public SimpleUrlHandlerMapping faviconHandlerMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
mapping.setUrlMap(Collections.singletonMap("**/favicon.ico", faviconRequestHandler()));
return mapping;
}
@Bean
public ResourceHttpRequestHandler faviconRequestHandler() {
ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
requestHandler.setLocations(resolveFaviconLocations());
return requestHandler;
}
private List<Resource> resolveFaviconLocations() {
String[] staticLocations = getResourceLocations(this.resourceProperties.getStaticLocations());
List<Resource> locations = new ArrayList<>(staticLocations.length + 1);
Arrays.stream(staticLocations).map(this.resourceLoader::getResource).forEach(locations::add);
locations.add(new ClassPathResource("/"));
return Collections.unmodifiableList(locations);
}
}
而在2.2.X版本的springboot代码中,该段配置类从这个auto配置webmvc的类中移除掉了。
框架开源的好处就是我们可以在github中搜索到他的提交记录,真的太方便了。
首先我可以确定这个favicon.ico文件是个静态资源,在
WebMvcAutoConfiguration这个类中配置。
于是我定位到github这个项目的WebMvcAutoConfiguration.java文件
在历史记录里面我发现了两条相关的提交记录,提交者wilkinsona,提交时间2019 Aug 21和Aug 23。
稍微读了一下他的操作,第一次把resources路径下的ico文件优先级提高到类路径之前,第二次就直接把默认带的spring网站图标文件favicon.ico文件给删了,即不提供默认的ico文件了,并且把原本在autoconfig里面的配置删了。
总结:
favicon.ico即Favorites Icon的缩写,它是一个图标,会出现在支持它的浏览器标题左边。
浏览器会打开网站会自动在网页项目的资源目录下搜索这个文件名的图标文件,有就显示。故springboot即我们的项目其实现在是不需要过多的配置的。我想作者也是想精简项目代码吧,不做重复的操作,在这里不得不佩服源码的作者们!
我们的页面在标签上添加下面一段代码并且资源文件放放对,即可成功让浏览器调到我们的图标文件,如果还没有不妨试试刷新浏览器缓存~
<link rel="icon" href="assets/img/favicon.ico">
这里其实我是为阅读源码的小伙伴提供一个解决思路。我们学习时使用的jar包版本可能各种各样,如果前后版本的不同影响到阅读代码时,不妨试着去找找不同,并且揣测一下作者的用意。
说不定下次你也会成为一个贡献源码的作者,后面是小白在阅读你的提交记录!