方法一
在使用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语句块会自动关闭应用上下文对象。
评论 (0)