【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
1、 spring 在扫描bean的时候会扫描方法上是否包含@async的注解
- 如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类(我们原本写的bean)的对应方法。
- spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。
- 我们可以关注到再配置task的时候,是有参数让我们配置线程池的数量的。
- 因为这种实现方法,所以在同一个类中的方法调用,添加@Async注解是失效的!原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用
2、spring为我们提供了AOP,面向切面的功能(和smartFrame AOP实现原理差不多)
- 他的原理和异步注解的原理是类似的,spring在启动容器的时候,会扫描切面所定义的类。
- 在这些类被注入的时候,所注入的也是代理类,当你调用这些方法的时候,本质上是调用的代理类。
- 通过代理类再去执行父类相对应的方法,那spring只需要在调用之前和之后执行某段代码就完成了AOP的实现了
来源:oschina
链接:https://my.oschina.net/u/3847203/blog/1844219