最近我不得不从应用程序中删除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
的其他类就像以前一样。
@Transactional
使用AOP但仍然不明白为什么(编辑:为什么它会使代理服务器,而不是它使用它的原因)。答案 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动态代理。这样可以代理任何接口(或接口集)。