首页 > 解决方案 > 使用 Spring 服务的构建器类

问题描述

我想在 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();

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

标签: javaspringdependency-injectionautowiredbuilder

解决方案


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

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

new BankAccount.Builder(1234L)
            .withOwner(25324, userService)

2)将UserService添加到Builder并创建builder工厂:

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

Usage:
    builderFactory.newBuilder(1234L)
                    .withOwner(25324)

推荐阅读