@Transactional让getClass在类上返回com.sun.proxy。$ Proxy

时间:2018-04-13 09:04:07

标签: java spring spring-boot

最近我不得不从应用程序中删除Spring Boot(2.0.0)并在其中使用纯弹簧(springboot在dependdency manager中设置,因此版本相同)。

public interface I {
  void doSth();
}

@Service
public class A implements I {
  @Transactional
  public void doSth(){
  }
}

public class XYZ {
 @Autowired
 public void registerI(I[] array){
  array[0].getClass() //returns com.sun.proxy.$Proxy73 
 }
}

因为array[0].getClass()开始返回com.sun.proxy.$Proxy73而不是com.package.path.A。实现I但没有@Transactional的其他类就像以前一样。

  1. 为什么会这样?我认为这是因为@Transactional使用AOP但仍然不明白为什么(编辑:为什么它会使代理服务器,而不是它使用它的原因)。
  2. 为什么当我使用Spring Boot时它不会那样? Spring boot是否有一些依赖它的依赖?

1 个答案:

答案 0 :(得分:1)

你是春天使用AOP for @Transactional方法(你怎么想在没有AOP的情况下装饰方法?)。

  

关于Spring Framework的声明式事务支持,最重要的概念是通过AOP代理启用此支持,并且事务性建议由元数据驱动(当前基于XML或基于注释)。 AOP与事务元数据的组合产生一个AOP代理,该代理使用TransactionInterceptor和适当的PlatformTransactionManager实现来驱动围绕方法调用的事务。

Spring Boot 2.0默认使用CGLIB代理,包括AOP支持。但是spring框架将使用jdk代理。

请参阅spring boot migration guide

  

Spring Boot现在默认使用CGLIB代理,包括AOP支持。如果需要基于代理的代理,则需要将spring.aop.proxy-target-class设置为false。

spring framework aop documentation

  

Spring AOP默认使用AOP代理的标准JDK动态代理。这样可以代理任何接口(或接口集)。