以下是我的用例:
有两个配置类。
客户端配置:
@Configuration
public class ClientConfig {
@Bean
public DeleteFiles deleteFiles() {
return new DeleteFiles();
}
}
用户配置:
@Configuration
public class UserConfig {
@Autowired
private DeleteFiles deleteFiles;
@Bean
public static CustomScopeConfigurer registerWorkflowScope() {
CustomScopeConfigurer customScopeConfigurer = new CustomScopeConfigurer();
customScopeConfigurer.addScope("workflow", new WorkflowScope());
return customScopeConfigurer;
}
@Bean
@Scope("workflow")
public RandomClass fn() {
return new RandomClass(deleteFiles);
}
}
deletefiles在作用域方面的行为如何?是否会为每个新工作流创建一个新的deletefiles对象?
是否有任何方法可以通过一些单元测试或其他方法来测试deletefiles作用域的行为。
我们可以在deletefilesbean上使用@scope(“workflow”),因为它在不同的配置类中。
1条答案
按热度按时间qni6mghb1#
默认情况下,创建singleton的bean。这意味着你注入它的每一个地方(自动连线或其他方式),都是使用的同一个示例。
您可以通过指定bean的作用域来改变这一点——“prototype”作用域允许多个示例对象,每次请求时都会创建一个唯一的示例。还有其他作用域,例如“request”,它的作用域是http请求的生存期。有关更多信息,您可以参考关于bean范围的spring文档,或者这个baeldung指南。
在您的示例中,clientconfig声明了一个deletefilesbean。当spring处理这个配置时,它会按照您的说明来示例化和配置这个bean,然后将它添加到bean注册表中。当它稍后处理userconfig时,它会看到您已经自动连接了deletefiles的一个示例,因此它在其注册表中获取该示例并将其分配给该变量。如果您要创建一个使用构造函数注入来传递deletefiles示例的组件,它会将同一个示例从spring的bean存储库传递到该构造函数中。
要指定不同的范围(例如prototype),可以使用
@Scope
注解:对于测试,通常的工作流程是为deletefiles类编写常规的单元测试,为clientconfig类编写测试以验证bean的正确示例化,并将一个mock示例注入userconfig测试(或使用bean的任何其他地方),然后您可以取消或模拟deletefiles示例mock上的所有调用。