Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Builder class using Spring services

I would like to create a builder class (i.e. a class implementing the builder design pattern) in a Spring project. The problem is that I need the builder to use some Spring services. I obviously don't want the user to explicitly provide the services in the constructor, but when I tried to @Autowire the services, I got Autowired members must be defined in valid Spring bean. I could Annotate my builder with @Component, but that would make it a singleton which will not be desirable for a builder. How can I inject services to my builder class without making it a singleton?

To use the example from this article, lets say I have the following builder:

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

I want withOwner to use my UserService to get the actual user from the database given the id number received as a parameter. How would I go about injecting UserService to builder?

like image 697
shayelk Avatar asked Dec 21 '25 04:12

shayelk


1 Answers

There are 2 ways to do that:

1) Put service into withOwner() method

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

2) Add UserService to the Builder and create a builder factory:

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

Usage:
    builderFactory.newBuilder(1234L)
                    .withOwner(25324)
like image 153
i.bondarenko Avatar answered Dec 23 '25 18:12

i.bondarenko