今天遇到一个问题,在使用@Autowired对List集合进行自动装配时,发现我要初始化的list并没有直接引用另一个list实例,而是把它作为一个元素add进去。
例如:
我期待的list [你好]
自动装配后的list [[你好]]
直接多了一层嵌套,而不是直接引用。
想要让需要装配的属性元素直接引用传入的list,而不是仅仅只作为它的一个元素时,在set方法中把this.list = list; 改为this.list = (List<Object>) list.get(0);
这样就可以直接引用了。这样的装配方式,其实是Spring的规则。
package com.yc.collection; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class Collection { private List<Object> list; private Map<String,String> map; private Set<String> set; public List<Object> getList() { return list; } @Autowired @Qualifier("list") public void setList(List<Object> list) { //this.list = list; //当前list==》 [[你好]] this.list = (List<Object>) list.get(0); //解决方案 } }
package com.yc.collection; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyConfig { @Bean public Collection collection() { return new Collection(); } @Bean(name="list") public List<String> list(){ ArrayList<String> list=new ArrayList<String>(); list.add("你好"); return list; } }
package com.yc.collection; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { public static void main(String[] args) { //如果完全使用了配置器方式去做,我们就只能通过AnnotationConfig来获取上下文 ApplicationContext contex=new AnnotationConfigApplicationContext(MyConfig.class); Collection c=(Collection) contex.getBean("collection"); System.out.println("list:"+c.getList()); } }
System.out.println("list:"+c.getList()); 这行代码输出的结果为 list:[[你好]]