Spring中使用@Transactional注解,Bean对象注入发生类型转变异常解决方法

Spring中使用@Transactional注解,Bean对象注入发生类型转变异常解决方法

渡星河
2023-03-10 / 0 评论 / 18 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年03月10日,已超过558天没有更新,若内容或图片失效,请留言反馈。

方法一

在使用Spring中使用@Transactional注解的时候,Spring会使用AOP代理来织入事务处理逻辑。因为代理对象是动态生成的,所以在注入Bean时,实际上注入的是代理对象,而不是原始对象。

代理对象的类名通常是以$Proxy开头的,后面跟着一个数字,表示这是代理对象的序号。这个序号是根据代理对象的生成顺序生成的,所以不同的代理对象会有不同的序号。

因此,当你在使用@Transactional注解时,如果你注入的是一个类,那么实际上注入的是代理类。如果你想获取原始对象,可以使用Spring提供的AopUtils.getTargetClass()方法获取代理对象的原始类,例如:

Object target = AopUtils.getTargetClass(bean);

其中,bean是代理对象,target是原始对象。

方法二

你可以使用try-with-resources语句块来自动关闭Spring的应用上下文对象,以确保资源能够得到正确的释放。同时,也可以使用更加类型安全的getBean()方法来获取原始类型的Bean实例,避免了类型转换带来的不便。

下面是修改后的代码示例:

try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("balance.xml")) {
    AccountService accountService = context.getBean(AccountService.class);
    accountService.transfer("2", "1", 400.0);
}


在这个代码中,我们使用try-with-resources语句块创建Spring的应用上下文对象,并且使用getBean()方法来获取原始类型的AccountService实例。这样就避免了类型转换带来的不便。最后,在完成操作之后,try-with-resources语句块会自动关闭应用上下文对象。

1

评论 (0)

取消