Spring Framework(十三)Spring Framework 自动注入Resource[]

本文探讨了Spring Framework中Resource自动注入的工作原理,解释了为何可以注入Resource数组但不能转换为其他类型。通过分析上下文初始化过程和类型编辑器注册,揭示了由于Java泛型擦除导致的限制。
摘要由CSDN通过智能技术生成

今天主要说明一下这两天遇到的两个问题

  1. 自动注入Resource是如何实现的?
  2. 使用自动注入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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值