首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Spring事务“套路”面试

与这个面试者聊了一会儿,咦,发现他水平还可以,我内心有点儿喜出望外,终于遇到一个“合格”的“陪聊者”了,我要用Spring事务“好好套路”他一下。 我:你在开发中,一般都把事务加到哪一层? 他:都加到Service层。 我:现在基本都是基于注解的配置了,那和事务相关的注解是哪个? 他:我不太会读那个单词,就是以@T开头的那个。 我:我明白你的意思,就是@Transactional。 他:是的。 我:与自己写代码来开启和提交事务相比,(先给他来个小的套路),这种通过注解来使用事务的方式叫什么? 他:(犹豫了两、三秒),不知道。 我:如果把写代码那种叫编程式事务,那与之相对的应该是什么式事务? 他:哦,声明式事务。 我:(先铺垫),不加注解,没有事务,加上注解,就有事务,可见事务和注解有莫大的关系。(开始套路),那加上注解后,到底发生了什么变化呢,就有了事务? 他:(犹豫了几秒钟),不知道。 我:(哈哈,意料之中),那我换一问法,Spring声明式事务的底层是怎么实现的? 他:是通过代理实现的。 我:(铺垫),代理这个词不仅计算机里有,现实生活中也经常见到代理,比如招华北地区总代理等等。(套路),那你能不能在生活中举一个代理的例子? 他:(想了一会儿),我没有想到什么好例子。 我:(开始聊会天),我看你老家离这还挺远的,你一般都什么时候回去啊? 他:一般都国庆节或春节会回去。其它时间假期短就不回去了。 我:(引子),国庆节和春节,人都很多啊,票不好买吧? 他:是啊,都在网上抢高铁票,不停地刷。 我:(引子),现在有了高铁,出行确实方便了很多。那你知道以前没有高铁、没有12306的时候,人们都是怎么买票的吗? 他:我虽然没有经历过,但是我知道。那时候春运,都在火车站售票大厅买票,人们排很长的队,有时需要等半天,还不一定有票。 我:(切入正题),除了火车站售票大厅外,你有没有见过在城市里分布的一些火车票代售点? 他:现在偶尔还能见到几个,但都已经关门了。 我:是啊,现在都网上买票了,代售点算是被历史抛弃了。(开始套路),那你觉得代售点算不算火车站售票大厅的代理呢? 他:火车站售票大厅可以买票,代售点也可以买票,应该算是代理吧。 我:从广义讲算是代理。但有两点需要注意: 一是,代售点卖的也是售票大厅的票,它自己是没有票的,它只是行使售票大厅的权利。 二是,它可以有属于自己的行为特征,比如不需要排队啊,每张硬座票收5元手续费啊等等。 我们平时听到的中间商/代理商,其实都差不多是一回事儿。 他:经你这么一说,我明白了。 我:那我们再说回到Spring中的代理,在Spring中生成代理的方式有几种? 他:两种,JDK动态代理和CGLIB。 我:那它们分别用于什么情况下? 他:JDK动态代理只能用于带接口的,CGLIB则带不带接口都行。 我:(铺垫),假如有个接口,它包含两个方法a和b,然后有一个类实现了该接口。在该实现类里在a上标上事务注解、b上不标,此时事务是怎样的? 他:a标注解了,肯定有事务,b没有注解,所以没有事务。 我:嗯,是这样的。(开始套路),现在来做个简单的修改,在方法b里调用方法a,其它保持不变,此时再调用方法b,会有事务吗? 他:应该有吧,虽然b没有注解,但a有啊。 我:(我需要带带他),假设现在你和我都不知道有没有事务,那我们来分析分析,看能不能找出答案。你有分析思路吗? 他:没有。 我:行吧,那我们开始。这是一个带接口的,那就假定使用JDK动态代理吧。从宏观上看,就是Spring使用JDK动态代理为这个类生成了一个代理,并为标有注解的方法添加了和事务相关的代码,所以就具有了事务。那你知道这个代理大概会是什么样子的吗? 他:这个不知道。 我:通过代售点的例子我们应该知道,所有的代理都具有以下特点: 代理是一个空壳,它背后才是真正的老板。 代理可以行使老板的权力,所以它看起来“很像”老板,除非仔细查看,否则不易区分。 代理自己可以按需加进去一些行为特征,除非仔细查看,否则老板都不一定知道这些。 那我们回到程序世界,使用接口和类再套一下上面的特点: 代理类是一个空壳(或外观),它背后才是真正的类,通常称为目标类。由此得出代理类要包含目标类。 对目标类和代理类的使用方式是一样的,甚至你都不知道它是代理类。由此得出代理类和目标类的类型要兼容,对外接口一致。所以目标类实现的接口,代理类也要实现。 代理类在把执行流程代理给目标类的过程中,可以添加一些行为代码,如开启事务、提交事务等。 他:经你这么一分析啊,我知道该怎么写代码了,应该是这样的,请仔细看下代码,虽然很简单:

02
领券