今天主要说明一下这两天遇到的两个问题
- 自动注入Resource是如何实现的?
- 使用自动注入
List<Resource>
为空,但是Resource[]
确是ok的?
使用方式如下图所示
@Value("classpath*:xxx/*_xxx.json")
private Resource[] resourceList;
首先我们详细了解一下自动注入的Resource的流程实现
创建bean
=> 填充bean
==> @Autowired Bean后置处理器
===> 生成Autowire的元信息
====> BeanFactory解析依赖内容
======> 优先处理@Value内容
=======> 获取Value的值
========> 使用PlaceholderResolvingStringValueResolver处理 ${}
============> TypeConverterDelegate#convertIfNecessary 将string转化为目标类型
==============> TypeConverterDelegate#findDefaultEditor 查询转换器
================> ResourceArrayPropertyEditor#setValue
==================>resourcePatternResolver.getResources(pattern)
可以在后面看到可以通过TypeConverterDelegate
查找类型编辑器,这个类型编辑器的作用就是可以根据@Value待注入的内容进行注入,比如当前的是Resource[]
,那么找到对应的编辑器就是ResourceArrayPropertyEditor
。这就是为什么可以注入Resource[]的原理,
那么为什么不可以转换List<Resources>
呢?
首先在上下文初始化的时候,我们可以发现会自动注册一下的Editor
AbstractApplicationContext#prepareBeanFactory
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
//....
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment(