在JavaSpring注释中使用@enablesync将类级别实例设置为null
我使用下面的代码来测试我的异步实现。 (来自另一个SO职位的参考) 编辑:“在这里,MyAsyncClass是一个类,它有一些方法,用Spring的@Async注释进行了注释。”在JavaSpring注释中使用@enablesync将类级别实例设置为null,java,multithreading,spring,asynchronous,Java,Multithreading,Spring,Asynchronous,我使用下面的代码来测试我的异步实现。 (来自另一个SO职位的参考) 编辑:“在这里,MyAsyncClass是一个类,它有一些方法,用Spring的@Async注释进行了注释。” 正如代码注释中提到的,在使用@EnableAsync注释时,我在测试方法中将类级字段设置为null,并且在调试时显示了大量cglib$Callback字段 编辑: 主要类别: @Component public class MyAsyncClass { private final Param1 param1;
正如代码注释中提到的,在使用
@EnableAsync
注释时,我在测试方法中将类级字段设置为null
,并且在调试时显示了大量cglib$Callback
字段
编辑:主要类别:
@Component
public class MyAsyncClass {
private final Param1 param1;
private final Param2 param2;
@Autowired
public MyAsyncClass(final Param1 param1, final Param2 param2) {
this.param1 = param1;
this.param2 = param2;
}
@Async
public Future<T> performAction() {
String result = param1.getDefaultName() + param2.getDefaultName();
return new AsyncResult<String>(result);
}
@Async
public Future<String> performAnotherAction() {
String result = param1.getDefaultName() + param2.getDefaultName();
return new AsyncResult<String>(result);
}
}
您是否尝试过实际使用该对象,即调用其方法之一,并查看会发生什么?您看到的是一个动态代理。这就是允许异步魔法发生的原因。是的,MyAsyncClass有多个方法,它们按预期异步调用,但由于param1和param2设置为null,我无法测试我的方法逻辑并获得null指针。发布MyAsyncClass的代码,发布测试代码,问题是,当应用enablesync注释时,从测试方法访问时,我将把param1和param2设置为null。我希望param1和param2变量是我在Bean注释方法中设置的。如果您不发布它,我们将无法帮助您在代码中找到问题。99.999%的可能性是代码中存在问题,0.001%的可能性是Spring问题。
@Component
public class MyAsyncClass {
private final Param1 param1;
private final Param2 param2;
@Autowired
public MyAsyncClass(final Param1 param1, final Param2 param2) {
this.param1 = param1;
this.param2 = param2;
}
@Async
public Future<T> performAction() {
String result = param1.getDefaultName() + param2.getDefaultName();
return new AsyncResult<String>(result);
}
@Async
public Future<String> performAnotherAction() {
String result = param1.getDefaultName() + param2.getDefaultName();
return new AsyncResult<String>(result);
}
}
@Component
public class Param1 {
public String getDefaultName() {
return "Param1";
}
}
@Component
public class Param2 {
public String getDefaultName() {
return "Param2";
}
}