今天在整一个spring的ioc学习demo,碰到一个问题,居然@Autowire在set方法注入map时,map的key类型不能为String之外的其他类型,具体看下面问题
@Autowired public void setTypeMap(Map<Integer,String> typeMap) { this.typeMap = typeMap; }
xml注入配置,即时在map上加上key和value的类型也不行。
<property name="typeMap"> <map key-type="java.lang.Integer" value-type="String"> <entry key="1"> <value>COO)</value> </entry> <entry key="2"> <value>CFO</value> </entry> <entry key="3"> <value>CEO</value> </entry> </map> </property>
报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springweb.service.impl.HelloServiceImpl.setTypeMap(java.util.Map); nested exception is org.springframework.beans.FatalBeanException: Key type [class java.lang.Integer] of map [java.util.Map] must be assignable to [java.lang.String] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:589) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282) ... 13 more Caused by: org.springframework.beans.FatalBeanException: Key type [class java.lang.Integer] of map [java.util.Map] must be assignable to [java.lang.String] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:761) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:547)
查看spring的代码
else if (Map.class.isAssignableFrom(type) && type.isInterface()) { Class keyType = descriptor.getMapKeyType(); if (keyType == null || !String.class.isAssignableFrom(keyType)) { if (descriptor.isRequired()) { throw new FatalBeanException("Key type [" + keyType + "] of map [" + type.getName() + "] must be assignable to [java.lang.String]"); } return null; }
也就是spring使用Autowired进入注入时,map的key类型只能为string,但是
如果我使用set方法注入后者构造方法注入,map的可以是可以自动转为integer的。
set方法注入,不要在set方法上使用antowired
public void setTypeMap(Map<Integer,String> typeMap) { this.typeMap = typeMap; }
//构造方法注入 public HelloServiceImpl(String greetting,Map<Integer,String> typeMap){ this.greetting = greetting; this.typeMap = typeMap; System.out.println("call HelloServiceImpl constructor" + this.greetting); }
<constructor-arg type="Map" index="1"> <map> <entry key="1"> <value>COO</value> </entry> <entry key="2"> <value>CFO</value> </entry> <entry key="3"> <value>CEO</value> </entry> </map> </constructor-arg>
可以参考http://forum.springsource.org/showthread.php?105558-Autowired-injection-of-a-Map
相关推荐
### 泛型Hibernate的...本文详细介绍了如何实现泛型Hibernate,并将其与Spring框架集成,以及如何使用Maven构建工程。通过这些技术的应用,开发者可以更加高效地进行数据库操作,同时保证代码的可维护性和可扩展性。
《Spring 2.5.5 参考手册》是一份详尽的指南,旨在帮助开发者理解和使用Spring框架的2.5.5版本。Spring是一个开源的Java平台,它为构建企业级应用程序提供了全面的支持,包括依赖注入(Dependency Injection,DI)、...
Spring 2.5引入了对Java注解的广泛支持,开发者可以使用注解来声明Bean及其依赖,减少了对XML配置的依赖。例如,`@Autowired`用于自动装配依赖,`@Component`、`@Service`、`@Repository`和`@Controller`用于定义...
理解List、Set、Map接口和泛型的概念也是重要的考察点。 4. **多线程**:线程的创建(Thread类和Runnable接口)、同步机制(synchronized关键字、Lock接口)、并发工具类(如Semaphore、CyclicBarrier、...
14. **Spring框架**:Spring是Java开发中最流行的框架之一,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,极大地简化了企业级应用的开发。 15. **Java 8及更高版本的新特性**:如Lambda...
11. **注解(Annotation)**:注解是元数据的一种形式,可以用于提供编译器和JVM有关代码的额外信息,例如,Spring框架广泛使用注解进行依赖注入。 12. **垃圾回收(Garbage Collection)**:Java的自动内存管理...
13. **Spring框架**:讲解Spring的核心功能,如依赖注入、AOP(面向切面编程)、事务管理,以及Spring Boot和Spring Cloud的相关知识。 14. **网络编程**:涉及Socket通信,TCP/IP协议,HTTP协议,以及网络编程中的...
10. **泛型**:理解泛型的基本概念,如何使用泛型类、泛型方法,以及泛型通配符和边界。 11. **注解(Annotation)**:学习自定义注解和元注解,了解它们在编译、运行时的处理方式以及在Spring框架中的应用。 12. ...
11. **泛型**:理解泛型的概念,了解类型擦除,掌握泛型类、泛型接口、泛型方法的使用。 12. **注解(Annotation)**:了解注解的作用,如何自定义注解,以及元注解的使用。 13. **Spring框架**:熟悉Spring的核心...
1. **J2SE基础**:这部分是J2EE的基础,包括面向对象编程(封装、继承、多态),内存分析,递归,集合类(如List, Set, Map),泛型,自动装箱拆箱,Annotation,IO流,多线程编程,线程同步(如synchronized关键字...
20. **错误与调试技巧**:学会阅读和分析堆栈跟踪,使用调试工具进行问题定位。 以上知识点在Java面试中经常被考到,无论是笔试还是面试环节,掌握这些内容将有助于提升你在Java开发者职位的竞争优势。通过阅读提供...
- 掌握 Collection 和 Map 接口,以及泛型在容器中的应用。 3. **多线程** - 理解线程的基本概念,如创建线程的方式(Thread 类、Runnable 接口、ExecutorService)。 - 熟悉并发控制机制,如 synchronized、...
4. **集合框架**:List(ArrayList,LinkedList),Set(HashSet,TreeSet),Map(HashMap,TreeMap)等接口和类的使用,以及泛型的理解和应用。 5. **IO流**:字节流和字符流的区别,缓冲流的使用,以及...
- DI(依赖注入):理解依赖注入的原理,使用@Autowired和@Resource注解。 - AOP(面向切面编程):了解切面、通知、切入点表达式等概念,以及Spring AOP的实现。 10. **JVM优化**: - 参数调优:了解JVM启动...
- 泛型:理解泛型的使用和限制,以及通配符的运用。 4. **多线程** - 线程的创建与状态管理:Thread类和Runnable接口的使用,线程的生命周期。 - 同步机制:synchronized关键字,wait()、notify()和notifyAll()...
- 注解(Annotation):注解提供了元数据,可以用来编译时或运行时进行代码的处理,如Spring框架中的@Autowired。 -反射:反射API允许在运行时检查类、接口、字段和方法的信息,以及动态创建对象和调用方法。 通过...
annotation 枚举 泛型 反射 字符串和String研究 集合内容,List、Map 文件io和网络io bio、nio和aio 类加载器 常用设计模式 模板模式 单例模式 & 多例模式 代理模式 策略模式 原型模式 工厂模式 委托 其他 Spring5 ...
- 泛型:理解泛型的概念,知道如何在类、接口和方法中使用泛型来提高类型安全性。 - Lambda表达式:熟悉函数式编程,掌握Java 8引入的Lambda表达式和Stream API。 - 注解(Annotation):了解注解的定义、使用和...
它在许多框架中扮演重要角色,如Spring的依赖注入。 通过对《Java 宝典》的源代码进行学习和实践,读者不仅可以加深对Java语言的理解,还能提升解决问题和设计系统的能力。书中的示例代码涵盖了这些重要知识点,...
17. **Spring框架**:依赖注入(DI),AOP(面向切面编程),Spring Boot,Spring Cloud等相关知识。 18. **数据库相关**:JDBC连接,SQL语句,事务处理,数据库连接池(如C3P0, HikariCP)。 19. **网络编程**:...