`
cheng.xinwei
  • 浏览: 78432 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【spring】@async原理

阅读更多
    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率。今天我们来探讨下 spring 是如何完成这个功能的。

    spring 在扫描bean的时候会扫描方法上是否包含@async的注解,如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类(我们原本写的bean)的对应方法。spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。我们可以关注到再配置task的时候,是有参数让我们配置线程池的数量的。因为这种实现方法,所以在同一个类中的方法调用,添加@async注解是失效的!,原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用。

    那在深入一步,spring为我们提供了AOP,面向切面的功能。他的原理和异步注解的原理是类似的,spring在启动容器的时候,会扫描切面所定义的类。在这些类被注入的时候,所注入的也是代理类,当你调用这些方法的时候,本质上是调用的代理类。通过代理类再去执行父类相对应的方法,那spring只需要在调用之前和之后执行某段代码就完成了AOP的实现了!

   那最后我们还有一个问题,spring是如何动态的生成某一个类的子类的?代理类?

   生成代理类可以通过jdk 和 CGLIB 两种方式生成.具体的可以
   参考 1.代理类说明:http://wenku.baidu.com/link?url=YpU3CNXsyLivMCnpILQ1qQc8PcKuqRrqZd1X8hPNQa9QuBFmbpCugSdjkXlY2L_ey4rUxM7TlwHeAatL65e664h_W8n0IKgTP1vFU5wacrm
        2.CGLIB和JDK代理类的区别:http://www.blogjava.net/hello-yun/archive/2011/11/09/363359.html
这里就不详细说明了

   

   
分享到:
评论

相关推荐

    Spring @async方法如何添加注解实现异步调用

    主要介绍了Spring @async方法如何添加注解实现异步调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Spring中异步注解@Async的使用、原理及使用时可能导致的问题及解决方法

    主要介绍了Spring中异步注解@Async的使用、原理及使用时可能导致的问题及解决方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    Spring Boot集成教程之异步调用Async

    在项目中,当访问其他人的接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行,我们可以使用多线程来并行的处理任务,也可以使用spring提供的异步处理方式@Async。需要的朋友们下面来一起看...

    蚂蚁java架构师第七/八期含项目

    03.SpringMVC源码角度分析@async失效之谜(141分钟) 04.使用装饰模式设计分布式多级缓存框架(82分钟) 05.使用观察者模式设计异步多渠道群发框架(82分钟) 06.深入研究单例模式底层原理与防止破解(189分钟) 07.基于责任...

    SpringBoot新手学习手册

    文档内容 ...12.2、使用@Async实现异步调用 47 12.3、自定义参数 49 12.4、多环境配置 50 12.5、修改端口号 50 12.6、SpringBoot yml 使用 50 12.7、SpringBoot整合拦截器 51 12.8、发布打包 52

    淘宝放单源码Java-agan-boot:gan-boot

    大厂面试题:请讲下SpringBoot的日志框架原理? 配置日志的存储路径、设置日志的格式 02 在springboot中使用lombok 为什么要使用lombok,它解决了什么问题? idea安装lombok插件 案例实战:体验lombok的第一大...

    看透springMvc源代码分析与实践

    21.1 Spring MVC原理总结272 21.2 实际跟踪一个请求275 第22章 异步请求281 22.1 Servlet 3.0对异步请求的支持281 22.1.1 Servlet 3.0处理异步请求实例282 22.1.2 异步请求监听器Async-Listener284 22.2 ...

    阿里巴巴开源服务框架Dubbo.zip

     Dubbo 也是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 主要核心部件: Remoting: 网络通信框架,实现了 sync-over-...

    组织者:用于组织化Web服务器的有机Web框架

    它的组织是由于其众所周知的语法,例如在Spring Boot中使用的,它是有机的,因为Organizer很有意义:这就像用几乎自然的语言告诉服务器应该做什么。 Organizer通过反转控制原理来工作,例如在Node.js中为MVC开发...

    sqs-consumer:另一个SQS库专注于能够正常关闭

    SQS消费者基本原理有一些替代的SQS排队库。 它们都不集中于创建可以轻松启动和停止的组件。 该库专注于解决该问题。 库应使您尽可能使用最少数量的其他库。 例如,该库永远不会将您束缚于诸如Stuart Sierra的组件或...

Global site tag (gtag.js) - Google Analytics