DraegerMTN
DraegerMTN

Reputation: 1141

Autowiring multiple repositories into a single DAO in Spring - bad practice?

Let's say I have the following Spring Mongo repositories. ObjectOne, ObjectTwo and ObjectThree represent documents stored in separate collections within the same database

public interface RepositoryOne extends MongoRepository<ObjectOne, String> {
}

public interface RepositoryTwo extends MongoRepository<ObjectTwo, String> {
}

public interface RepositoryThree extends MongoRepository<ObjectThree, String> {
}

And then a single DAO class

public class ExampleDAO {
    @Autowired
    private RepositoryOne repositoryOne;

    @Autowired
    private RepositoryTwo repositoryTwo;

    @Autowired
    private RepositoryThree repositoryThree;

    //Various methods performing operations with repositoryOne
    //Various methods performing operations with repositoryTwo
    //Various methods performing operations with repositoryThree
}

Is it considered bad practice to be autowiring multiple repositories into a single DAO like above? It feels like the class may be doing too much and ideally I should have a single repository to maintain single responsibility. If it is bad practice, would a separate DAO for each repository be the way to go, or is there a Spring magic way to create a single repository that I can use to call a more specific repository?

Upvotes: 4

Views: 3225

Answers (2)

Anil Bachola
Anil Bachola

Reputation: 289

Its a bad practice to have multiple unrelated responsibilities for a single class. If they are related consider creating a 'service' class and autowire the repositories. And also the methods in service class can abstract the methods in repositories, for example:

class ExampleService {
    @Autowired
    private RepositoryOne repositoryOne;

    @Autowired
    private RepositoryTwo repositoryTwo;

    void saveEmployee(Employee e) {
        repositoryOne.save(e);
        repositoryTwo.update(e.getEmpId);
    }
}

Upvotes: 4

Vasu
Vasu

Reputation: 22442

No one will be able to tell whether your ExampleDAO is fine to use multiple repositories or not unless looking into the actual business logic.

However, your ExampleDAO class seems like acting as a business service (look here for the subject of DAO vs Repository, they both actually different ways of implementing data access layers). In other words, you need to ensure that your ExampleDAO class handles/owns a single responsibility.

Also, the other important point is that it is a bad practice to use the field injection rather use the constructor injection. I suggest you go through here on this subject.

Upvotes: 3

Related Questions