【问题中的配置】
spring相关配置文件root-context.xml mvc-context.xml其中mvc-context.xml被包含于root-context.xml
web.xml的配置为
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/spring/root-context.xml
</param-value>
</context-param>
<servlet>
<servlet-name>haha</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/mvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>haha</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
添加@Async的类被 <context:component-scan base-package="com.haha.service.impl"></context:component-scan>和
<context:component-scan base-package="com.haha.controller"></context:component-scan>放于mvc-context.xml
【修改后Ok的配置】
将 <context:component-scan base-package="com.haha.service.impl"></context:component-scan>放于root-context.xml
注意不能将controller的也迁移到root-context.xml,否则controller的Bean无法实例化
原因:详见解决要点
===========================================
解决要点:
一、In short, the context loaded by the ContextLoaderListener (generally from applicationContext.xml) is the parent of the context loaded by the DispatcherServlet (generally from *-servlet.xml). If you have the bean with the @Async method declared/component-scanned in both contexts, the version from the child context (DispatcherServlet) will override the one in the parent context (ContextLoaderListener). I verified this by excluding that component from component scanning in the *-servlet.xml -- it now works as expected.
要点:注意component-scan里面扫包不要重复扫。
===========================================
解决问题参考文献:
http://blog.csdn.net/haiyangzhishen/article/details/46930677
今天用了一下spring的@Async功能,遇到了一些问题。大家用的时候一定要注意:
1、异步方法和调用类不要在同一个类中
2、注解扫描时,要注意过滤,避免重复实例化,因为存在覆盖问题,@Async就失效了
非常感谢下面三篇文章的作者:
http://www.kaifajie.cn/XiangMuKuangJia/s13035.html
http://www.cnblogs.com/youngjoy/p/3817471.html
http://blog.csdn.net/jokes000/article/details/24649173
相关推荐
JAVA 中Spring的@Async用法总结 在 Java 应用中,绝大多数情况下都是通过同步的方式来实现交互处理的...以上就是 Spring 中 @Async 的用法总结,通过使用 @Async 可以轻松地实现异步调用,提高系统的响应速度和性能。
Spring中@Async注解执行异步任务的方法 在业务处理中,有些业务使用异步的方式更为合理。这篇文章主要介绍了Spring中@Async注解执行异步任务的方法。@Async注解是Spring提供的一个annotation,可以将方法异步化,...
Spring Boot @Async 异步任务执行方法 Spring Boot 框架提供了 @Async 注解来支持异步任务执行,该注解可以将方法调用转换为异步调用,从而提高应用程序的并发能力和响应速度。下面是关于 Spring Boot @Async 异步...
浅谈Spring @Async异步线程池用法总结 本文主要介绍了Spring @Async异步线程池的用法总结,包括异步线程池的接口类、@Async定义异步任务、Spring开启异步配置等内容。 1. 异步线程池的接口类 Spring提供了多种...
- 异步方法不会阻塞当前执行线程,而是立即返回,并在后台线程中执行实际的方法逻辑。 2. **配置异步支持** - 在Spring Boot应用中,需要启用异步支持。这通常通过在主配置类(通常带有@SpringBootApplication...
@Async 注解是 Spring 框架提供的一种异步执行方法的实现方式,从 Spring 3.0 版本开始提供。使用 @Async 注解可以将方法标识为异步方法,通过 SimpleAsyncTaskExecutor 执行,但不推荐使用这个默认线程池。 @Async...
在Spring Boot中,使用@Async注解可以将方法异步执行。@Async注解可以应用于方法上,使得该方法可以异步执行。例如: ```java @Async public void doTask() { // 异步执行的任务 } ``` 在上面的代码中,doTask()...
Spring 框架提供了多种注解来帮助开发者简化代码,例如 @Async 用于异步执行方法、@Transaction 用于事务管理等。但是,在使用这些注解时,可能会遇到一些问题,例如 @Async 注解引发其他注解失效的问题。 在文章中...
本文将详细介绍Spring框架中的@Async注解,并深入理解其在解决异步调用问题中的应用。通过示例代码和详细的解释,帮助读者更好地理解@Async的使用和原理。 一、异步调用和同步调用 异步调用和同步调用是两种不同的...
@Async 注解,如果包含的,Spring 会为该 Bean 动态生成一个代理类,代理类是继承我们所写的 Bean 的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会...
Spring中@Async注解实现异步调用详解 在Spring框架中,@Async注解是实现异步调用的一个重要机制。异步调用是指在程序执行过程中,不需要等待某个方法的执行结果,而是继续执行下一个方法。这种机制可以极大地提高...
Spring Boot @Async 异步方法是 Spring Boot 框架中的一种异步编程方式,允许开发者在不阻塞主线程的情况下执行高耗时方法。下面将详细介绍 Spring Boot @Async 异步方法的使用和原理。 什么是异步调用 异步调用是...
在Spring Boot应用中,我们可以利用`@Async`注解实现异步调用,这有助于提高应用程序的并发性能,尤其在处理耗时操作时。本文将详细介绍如何使用`@Async`结合`Future`来处理异步任务,并探讨如何定义超时。 `@Async...
在Spring Boot中,异步调用是通过Spring的`@Async`注解来实现的,它允许我们在不阻塞主线程的情况下执行耗时的操作。这极大地提高了应用的响应速度,尤其是在处理大量并发请求时。接下来,我们将深入探讨如何在...
Spring的`@Async`注解用于标记一个方法为异步执行,它与`@Scheduled`结合可以实现异步定时任务。首先,我们需要启用异步支持: ```java @Configuration @EnableAsync public class AsyncConfig implements ...
一旦标记了一个方法,Spring会在单独的线程中执行该方法,让调用者可以立即返回继续执行其他代码。启用@Async功能有两种方式: - **基于Java配置**: ```java @Configuration @EnableAsync public class ...
在上述代码中,`longRunningTask`方法被标记为异步,这意味着当它被调用时,Spring会将其放入一个单独的线程中执行,而不会阻塞当前请求的处理。`Future`返回类型允许我们在需要时获取异步任务的结果。 为了调用这...
Spring 中异步注解 @Async 的使用、原理及使用时可能导致的问题及解决方法 @Async 注解是一种非常有用的spring 注解,它可以让被标注的方法异步执行,从而提高应用程序的性能和响应速度。但是,@Async 注解的使用也...
在Spring Boot中,你可以通过`logging.level.org.springframework.scheduling=DEBUG`配置日志级别,来查看异步任务的执行情况。此外,还可以利用Actuator模块的 `/async`端点监控异步任务的状态和执行时间。 5. **...
每个`@Async`注解的方法会在后台线程中执行,而不是在调用它们的主线程中。这意味着,即使这些方法执行时间较长,也不会阻塞主线程。需要注意的是,`@Async`不适用于静态方法,因为它依赖于Spring的代理机制,而静态...