一、 spring 在扫描bean的时候会扫描方法上是否包含@async的注解spring
- 若是包含的,spring会为这个bean动态的生成一个子类,咱们称之为代理类(?),代理类是继承咱们所写的bean的,而后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法须要异步执行,就不会调用父类(咱们本来写的bean)的对应方法。
- spring本身维护了一个队列,他会把须要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。
- 咱们能够关注到再配置task的时候,是有参数让咱们配置线程池的数量的。
- 由于这种实现方法,因此在同一个类中的方法调用,添加@Async注解是失效的!缘由是当你在同一个类中的时候,方法调用是在类体内执行的,spring没法截获这个方法调用
二、spring为咱们提供了AOP,面向切面的功能(和smartFrame AOP实现原理差很少)异步
- 他的原理和异步注解的原理是相似的,spring在启动容器的时候,会扫描切面所定义的类。
- 在这些类被注入的时候,所注入的也是代理类,当你调用这些方法的时候,本质上是调用的代理类。
- 经过代理类再去执行父类相对应的方法,那spring只须要在调用以前和以后执行某段代码就完成了AOP的实现了