Java @Runnable@Component类中的Async不允许它自动连接
我有两个类Uploader和UploadTask。使用弹簧4Java @Runnable@Component类中的Async不允许它自动连接,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有两个类Uploader和UploadTask。使用弹簧4 @Service public class Uploader{ @Autowired private UploadTask task; } @Component public class UploadTask implements Runnable{ @Async public void soso(){ } public void run(){ } } 在应用程序启动时,我遇到以下
@Service
public class Uploader{
@Autowired
private UploadTask task;
}
@Component
public class UploadTask implements Runnable{
@Async
public void soso(){
}
public void run(){
}
}
在应用程序启动时,我遇到以下异常:
org.springframework.beans.factory.BeanCreationException:创建名为“uploader”的bean时出错:自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动连线字段:private com.xx.uploading.UploadTask com.xx.Uploader.task;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:未找到依赖项类型为[com.xx.upload.UploadTask]的符合条件的bean:至少需要1个符合此依赖项autowire候选项条件的bean。依赖项批注:{@org.springframework.beans.factory.annotation.Autowired(required=true),@org.springframework.beans.factory.annotation.Qualifier(value=uploadTask)}
我认为这可能是因为UploadTask是可运行的。当我删除@Async注释时,它不会引发任何异常。有什么解释吗
更新:
当我看到日志时,我发现UploadTask类bean正在创建中。自动连线时找不到它。有一个用于私有上传任务的公共setter;和测试。在类级别使用@enablesync
@Component
@EnableAsync
public class UploadTask implements Runnable{
@Async
public void soso(){
}
public void run(){
}
}
在context.xml文件中配置服务类。
像下面的代码。
用您的数据源名称更改xxx。
我已成功运行此代码。请看下面我的代码
@Service
public class Uploader{
@Autowired
private UploadTask task;
public void display(){
task.run();
task.soso();
}
}
@Component
public class UploadTask implements Runnable{
@Async
public void soso(){
System.out.println("Upload task running---");
}
public void run(){
System.out.println("Running the class UploadTask---------");
}
}
Spring.xml
<mvc:annotation-driven/>
<context:component-scan base-package="com.exp" />
下面是我的Pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringAsync-Exmp</groupId>
<artifactId>SpringAsync-Exmp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
上传任务接口
@Component
public interface UploadTask extends Runnable{
@Async
public void soso();
public void run();
}
UploadTaskImpl类
public class UploadTaskImpl implements UploadTask{
public void soso()
{
System.out.println("Inside the class----");
}
public void run()
{
System.out.println("Inside the class--run--");
}
}
其他的都一样。这次我创建了UploaderTask作为接口,并编写了一个新类来实现它。这就解决了问题
我认为@EnableAsync正在将任何使用@Async的组件转换为代理,实现该组件类使用的相同接口,因此当使用具体类生成autowire时,该具体类和代理之间将面临类型冲突。这是多余的。批注可以做到这一点。@EnableAsync没有帮助。无论如何,我已经在上下文文件中编写了。所以这个注释不做任何额外的事情。我已经提到删除@Async可以解决这个问题。因此,这不是一个公众设定者的问题。我看不到你的回答中有任何特别的补充。我该怎么做才能使我的案子成功?此外,您的类和上下文中都没有@EnableAsync。如果没有这个,你的案子就不应该运行。我已经修改了答案,以满足你的要求。请评论它是否适合您。您是否尝试过此解决方案。这对我有用。你也会因此得到同样的错误。请分享错误的详细信息。是的,我尝试了你的解决方案。我也遇到了同样的错误。
@Async
需要创建代理,并且根据您的配置,代理类型为可运行
。因此,没有办法在可运行的内部创建一个异步方法吗?或者先创建一个上传任务
接口,让组件实现它,或者更改代理spring配置中的配置。当然,假设这就是问题所在,制作一个单独的接口是行不通的。
@EnableAsync
@Service
public class Uploader{
@Autowired
private UploadTask uploadTask;
public UploadTask getUploadTask() {
return uploadTask;
}
public void setUploadTask(UploadTask uploadTask) {
this.uploadTask = uploadTask;
}
public void display(){
uploadTask.run();
uploadTask.soso();
}
}
@Component
public interface UploadTask extends Runnable{
@Async
public void soso();
public void run();
}
public class UploadTaskImpl implements UploadTask{
public void soso()
{
System.out.println("Inside the class----");
}
public void run()
{
System.out.println("Inside the class--run--");
}
}