关于集合注入

来源:3-17 注入集合对象-1

信纸呀

2022-11-11 16:08:16

问题描述:
请问一下老师
1、使用list进行注入,转换的是arraylist类型,在实体类中将list改成linkedlist,结果在xml文件中list会报错,那么是不是spring底层只支持转换成arraylist,是否是固定写死的,如果是的话,为什么是这样的,如果不是,使用其他类型的list该怎么操作
2、set和map是不是也只支持转换成linkedhashset和linkedhashmap
写回答

1回答

好帮手慕小脸

2022-11-11

同学你好,

1、是的,默认情况下,List是会转化为ArrayList的,这是Spring的默认行为

2、按照同学所说的,如果想转换为其他类型,例如:LinkedList的话,那就必须要增加转换器,即如下代码示例:

import org.springframework.core.convert.converter.Converter;
import java.util.ArrayList;
import java.util.LinkedList;
public class LinkedListConvereter implements Converter<ArrayList, LinkedList> {
    @Override
    public LinkedList convert(ArrayList source) {
        LinkedList llist = new LinkedList();
        for(Object obj : source){
            llist.add(obj);
        }
        return llist;
    }
}

注意:这里转换器如果要生效的话,必须要在application-context.xml配置文件中增加conversionService,也就是去注册这个转换器

application-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置转换器 -->
    <!--注册类型转换器UserConverter -->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="org.example.LinkedListConvereter" />
            </list>
        </property>
    </bean>
    <bean id="sample" class="org.example.ListSample">
        <property name="list" >
            <list>
                <!--<bean class="org.example.LinkedListConvereter" />-->
                <value>A</value>
                <value>B</value>
                <value>C</value>
            </list>
        </property>
    </bean>
</beans>

其次就是在应用的过程中,在进行注入的时候,例如:这里自定义的接收类ListSample

public class ListSample {
    private LinkedList list;
    public LinkedList getList() {
        return list;
    }
    public void setList(LinkedList list) {
        this.list = list;
    }
}

它的属性类型必须是LinkedList能够对应上才可以,绝对不能写这个List的接口,这样的话,就会出现不知道走哪一个转换逻辑

综上所述:默认Spring不提供List与LinkedList的转换,若要实现转换必须要有转换器,其次要在xml文件中进行配置,最后属性类型必须是LinkedList,其他的转换也是遵循这样的道理哟~

https://img.mukewang.com/climg/636e1f6d09646f6b03130365.jpg

测试类
public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:application-context.xml");
        ListSample sample = ctx.getBean("sample", ListSample.class);
        System.out.println(sample.getList().getClass());
        System.out.println(sample.getList());
    }
}

3、是的,set和map也是默认转换成LinkedHashSet和LinkedHashMap

祝学习愉快~

0

0 学习 · 9886 问题

查看课程