使用Spring服务的Builder类

sha*_*elk 2 java spring dependency-injection builder autowired

我想在Spring项目中创建一个构建器类(即实现构建器设计模式的类)。问题是我需要构建器使用一些Spring服务。我显然不希望用户在构造函数中显式提供服务,但是当我尝试@Autowire提供服务时,我得到了Autowired members must be defined in valid Spring bean。我可以@Component用来注释我的构建器,但这会使它成为一个单例,这对于构建器而言是不希望的。如何将服务注入我的构建器类而不使其单身?

要使用本文的示例,可以说我有以下构建器:

BankAccount account = new BankAccount.Builder(1234L)
            .withOwner(25324)
            .atBranch("Springfield")
            .openingBalance(100)
            .atRate(2.5)
            .build();
Run Code Online (Sandbox Code Playgroud)

我想withOwner使用UserService给定的ID号作为参数从数据库中获取实际用户。我将如何向构建器注入UserService?

i.b*_*nko 5

有两种方法可以做到这一点:

1)将服务放入withOwner()方法

new BankAccount.Builder(1234L)
            .withOwner(25324, userService)
Run Code Online (Sandbox Code Playgroud)

2)将UserService添加到构建器并创建构建器工厂:

@Component
class BuilderFactory { 
    @Autowire
    private UserService user service
    BankAccount.Builder newBuilder(Long id) {
        return BankAccount.Builder(service, id);
    }
}

Usage:
    builderFactory.newBuilder(1234L)
                    .withOwner(25324)
Run Code Online (Sandbox Code Playgroud)