我想知道spring如何改变我的@transactional注释方法? 例如,我读了here关于如何在不使用@transactional的情况下运行事务方法。 春天究竟做了什么?
答案 0 :(得分:1)
Spring有效地为您的对象创建代理。因此,如果类“MyApplication”注入“DBService”,并且DBService上有一个@Transactional,那么spring将生成一个DBService Proxy。代理将注入MyApplication,并且对DBService方法的所有调用都将调用该代理。然后,在调用实际的DBService方法之前,允许该代理启动事务或执行任何需要的操作。
MyApplication -> DBService Proxy (intercepts calls) -> DBService
代理的制作细节可能会根据弹簧版本和您设置代码的方式而有所变化。你可以使用允许spring代理的接口,但是,如果你选择不使用接口,spring也可以扩展实际的类(使用一个名为CGLIB的库。前4,这需要一个默认的构造函数,尽管如此,最新的Spring 4默认构造函数不是必需的,它通过稍微不同的机制来实现)