构造函数注入spring中自定义作用域的java行为

ukxgm1gy  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(474)

以下是我的用例:
有两个配置类。
客户端配置:

@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”),因为它在不同的配置类中。

qni6mghb

qni6mghb1#

默认情况下,创建singleton的bean。这意味着你注入它的每一个地方(自动连线或其他方式),都是使用的同一个示例。
您可以通过指定bean的作用域来改变这一点——“prototype”作用域允许多个示例对象,每次请求时都会创建一个唯一的示例。还有其他作用域,例如“request”,它的作用域是http请求的生存期。有关更多信息,您可以参考关于bean范围的spring文档,或者这个baeldung指南。
在您的示例中,clientconfig声明了一个deletefilesbean。当spring处理这个配置时,它会按照您的说明来示例化和配置这个bean,然后将它添加到bean注册表中。当它稍后处理userconfig时,它会看到您已经自动连接了deletefiles的一个示例,因此它在其注册表中获取该示例并将其分配给该变量。如果您要创建一个使用构造函数注入来传递deletefiles示例的组件,它会将同一个示例从spring的bean存储库传递到该构造函数中。
要指定不同的范围(例如prototype),可以使用 @Scope 注解:

@Bean
@Scope("prototype")
Foo example() { ... }

对于测试,通常的工作流程是为deletefiles类编写常规的单元测试,为clientconfig类编写测试以验证bean的正确示例化,并将一个mock示例注入userconfig测试(或使用bean的任何其他地方),然后您可以取消或模拟deletefiles示例mock上的所有调用。

相关问题