在spring 3中,@Async注解能让某个方法快速变为异步执行,马上来先DEMO上手下。

假如在网站的用户注册后,需要发送邮件,然后用户得到邮件确认后才能继续其他工作; 
假设发送是一个很耗费时间的过程,因此需要异步。

1 namespace要注意,加上task

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
  3. xmlns:p=”http://www.springframework.org/schema/p” xmlns:context=”http://www.springframework.org/schema/context”
  4. xsi:schemaLocation=”
  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  6. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
  7. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd”>
  8. <context:component-scan base-package=”cs”/>
  9. </beans>

2 RegularService.java 注册类

    1. import org.springframework.beans.factory.annotation.Autowired;
    2. import org.springframework.stereotype.Service;
    3. import cs.async.MailUtility;
    4. @Service
    5. public class RegularService {
    6. @Autowired
    7. private MailUtility mailUtility ;
    8. public void registerUser(String userName){
    9. System.out.println(” User registration for  “+userName +” complete”);
    10. mailUtility.sendMail(userName);
    11. System.out.println(” 注册完成,邮件稍后发送“);
    12. }
    13. }
    14. 3 发送邮件的工具类
    15. <pre name="code" class="java">import org.springframework.scheduling.annotation.Async;
    16. import org.springframework.stereotype.Component;
    17. @Component
    18. public class MailUtility {
    19. @Async
    20. public void sendMail(String name){
    21. System.out.println(” 在做发送准备工作中  “);
    22. try {
    23. Thread.sleep(5000);
    24. } catch (InterruptedException e) {
    25. e.printStackTrace();
    26. }
    27. System.out.println(” 异步发送完毕“);
    28. }
    29. }
    30. </pre>
    31. <br>
    32. <br>4 最后在applicationContext.xml中加入:
    33. <br>  <pre name="code" class="java"><?xml version=”1.0″ encoding=”UTF-8″?>
    34. <beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
    35. xmlns:p=”http://www.springframework.org/schema/p” xmlns:context=”http://www.springframework.org/schema/context”
    36. xmlns:task=”http://www.springframework.org/schema/task”
    37. xsi:schemaLocation=”
    38. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    39. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    40. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd“>
    41. <context:component-scan base-package=”cs”/>
    42. <task:annotation-driven/>
    43. </beans>
    44. </pre>
    45. <br>   就是<task:annotation-driven/>这个一定不能少喔。
    46. <br>
    47. <br>5 运行:
    48. <br>   User registration for  tom complete
    49. <br>  注册完成,邮件稍后发送
    50. <br>在做发送准备工作中
    51. <br>异步发送完毕
    52. <br>
    53. <br>6 有的时候,要从异步中返回值,这个时候,spring会返回一个java.util.concurrent.Future对象,要调用其中的get方法,比如
    54. <br>   <pre name="code" class="java">@Async
    55. public Future<Balance> findBalanceAsync(final Account account) {
    56. Balance balance = accountRepository.findBalance(account);
    57. return new AsyncResult<Balance>(balance);
    58. }
    59. Balance balance = future.get();
    60. </pre>
    61. <br>
    62. <br>
    63. 注意事项:必须解决循环依赖
    64. 原理: spring 在扫描bean的时候会扫描方法上是否包含@async的注解,如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类(我们原本写的bean)的对应方法。spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。
    65. 今天对项目工程(spring3.0.6+structs2.2.3)进行瘦身,业务层bean统一用@Service注解,set注入用@Autowired替换,从xml配置文件中将业务bean配置全部清掉。
      这时专门处理异步操作的bean报循环依赖(引用):
      Bean with name ‘*********’ has been injected into other beans [******, **********, **********, **********] in its raw version as part of a circular reference具体情况是beanA注入用于异步处理的beanB(含有@Async注解的方法),用于对某些操作进行异步处理,而beanB又注入beanA用于实现异步处理
      解决方案:beanA注入异步处理的beanB的代理服务beanC(不含@Async注解),再由beanC注入beanB进行处理

@Async java 异步方法的更多相关文章

  1. 使用Spring的@Async创建异步方法

    使用Spring的@Async创建异步方法 在开发系统的过程中,通常会考虑到系统的性能问题,提升系统性能的一个重要思想就是“串行”改“并行”.说起“并行”自然离不开“异步”,今天我们就来聊聊如何使用S ...

  2. asyn4j -- java 异步方法调用框架

    asyn4j 是一个java异步方法调用框架,基于消费者与生产者模式.包括了异步方法执行,异步回调执行,异步工作缓存模块.支持Spring. 让我们写异步方法不再写很多的相关多线程代码.用asyn4j ...

  3. C#学习日志 day8 -------------- async await 异步方法入门(引用博客)以及序列化和反序列化的XML及json实现

    首先是异步方法的介绍,这里引用自http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html async and await 简单的 ...

  4. Spring异步方法注解 @Async

    @Async 0. 介绍 在Spring 3.x之后,通过内置@Async标明异步方法,可以简化异步开发流程. @Async既可提供无返回值的调用,也可提供有返回值的调用,下文将分别介绍两种使用方式. ...

  5. SpringBoot线程池的创建、@Async配置步骤及注意事项

    最近在做订单模块,用户购买服务类产品之后,需要进行预约,预约成功之后分别给商家和用户发送提醒短信.考虑发短信耗时的情况所以我想用异步的方法去执行,于是就在网上看见了Spring的@Async了. 但是 ...

  6. @Async的用法和示例

    @Async 注解的用法和示例 目录 @Async 注解的用法和示例 背景 异步调用 @Async介绍 在Spring中启用@Async 示例一:基本使用方式 示例二:在同一个类中调用异步方法 示例三 ...

  7. C#~异步编程再续~await与async引起的w3wp.exe崩溃

    返回目录 最近怪事又开始发生了,IIS的应用程序池无做挂掉,都指向同一个矛头,async,threadPool,Task,还有一个System.NullReferenceException,所以这些都 ...

  8. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  9. .NET4.5 异步编程 async和await

    msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...

随机推荐

  1. Android 高级编程 RecyclerView 控件的使用

    RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object    ↳ and ...

  2. 利用Oracle VM VirtualBox部署自己的owncloud存储服务器

    最近在弄文档方面的工作,所以想找个能够自动备份且带历史版本的网盘,找了很久没找到,所以决定自己部署一个私人服务器. 找了很久.试了很久终于确定owncloud能够满足自己的要求,而且还是开源免费的. ...

  3. RHEL7网卡设置

    1.改网卡名 先vim /etc/sysconfig/grub:GRUB_TIMEOUT=5GRUB_DEFAULT=savedGRUB_DISABLE_SUBMENU=trueGRUB_TERMIN ...

  4. codevs 1049 棋盘染色

    题目描述 Description 有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少.读入一 ...

  5. Discussing the scenery in the program of 863 with Doctor Zhang!

    今天,下午去了NEC找章丰博士师兄交流了一下863项目关于SDN场景的设置问题,通过交流感觉师兄的水平和层次完全在另一个层次,以及人家的谈吐. 主要的结论有以下几个:(1)移动性管理场景  (2)特殊 ...

  6. JNI基础概念以及原理-2016.01.11

    Java到C数据类型转换 1 基础类型 Java与Jni类型对应关系 2 String到char数组 具体使用方式 JNIEXPORT jstring JNICALL Java_com_zhoulee ...

  7. infusion度量金字塔数据解释

    inFusion能够探测超过20中代码味道和代码缺陷,包括重复代码,破坏封装的类(如数据类或者万能类),高耦合的方法和类,以及一些设计不合理的类继承结构.当我们使用inFusion工具分析代码时,在分 ...

  8. js的二元三元操作符

    二元 if ( a == b) { alert(a) } // (a == b) && alert(a) if ( a != b) { alert(a) } // (a == b) | ...

  9. c++ builder TreeView控件节点遍历

    void __fastcall TForm1::GetRootNodes(TTreeView *DestTreeView)//得到所有根节点 { TTreeNode *vNode = NULL; vN ...

  10. 在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi

    摘 自: http://blog.csdn.net/fxhflower/article/details/7276820 可使用以下代码: //Create our own namespaces for ...