解决:BeanNotOfRequiredTypeException
问题描述:在使用@Transactional注解处理事务(未使用AOP),在通过容器获取对象的时候出现了错误。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService",UserServiceImpl.class);
userService:容器通过动态代理实现的对象,继承UserService接口
UserServiceImpl:是UserService接口的实现类
错误信息:
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'userService' is expected to be of type 'com.rui.service.impl.UserServiceImpl' but was actually of type 'com.sun.proxy.$Proxy19'
问题分析:
- 添加了事务,Spring容器会产生UserService类相应的代理对象
- 默认采用的jdk的动态代理
- jdk的动态代理机制,是实现同一个接口。代理对象为接口类型的数据
- 代理对象与被代理对象属于兄弟关系,不能相互转化
问题解决方案:
getBean()时,声明bean的类型时,需要声明为接口类型。
若声明为被代理类UserServiceImpl类型,而代理类型为接口UserService类型。则无法转化
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService",UserService.class);
版权声明:本文为Always_moving原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。