How to cleanly (physically) separate a domain level from spring data code?

In my DDD-by-book application, I have a repository definition similar to this in my domain:

public interface CustomerRepository {
    Customer findById(long id);
    ...
}

The database integration level contains an implementation of this interface, for example:

public class CustomerDao implements CustomerRepository {
    public Customer findById(long id) {
        // access EntityManager or JDBCTemplates or ...
    }
}

There is a module for each level, and the database module depends on the domain and all integration libraries (for example, hibernate), and the domain module depends on something. Thus, we have a clean separation of problems and no “technical” domain dependencies, as DDD suggests. As a result, I can switch from the database to read-only memory by creating an appropriate repository implementation. The implementation that is being used is configured in my application level.

, Spring Data around. Spring, .

public interface CustomerRepository implements Repository<Customer, Long> {
    ....

, , , "" . in-memory spring -data . , .

? ? Spring ?

(BTW: - JPA, javax.persistence. , , javax.persistence . "", "" . , spring -data-annotation .)

+4
2

Spring Data Onion. :

  • CustomerRepository ( ) Spring :

    public interface CustomerRepository {
      Customer findById(long id);
      // ..
    }
    
  • CustomerDao , Spring :

    public CustomerDao implements Repository<Customer, Long> { }
    
  • CustomerRepository, CustomerSpringDataRepository CustomerDao, Spring:

    public class CustomerRepositoryImpl implements CustomerRepository {
       @Autowired private CustomerDao dao;
    
       public Customer findById(long id) { return doa.findById(id); }
    }
    
  • CustomerRepository

:

  • Spring , Spring
  • , , ( Spring Data),

Spring Onion .

+6

Inject Spring , "" .

public interface CustomerSprignDataRepository implements Repository<Customer, Long> {

}

public class CustomerDao implements CustomerRepository {

      @Inject
      private CustomerSprignDataRepository customerSprignDataRepository;

      public Customer findById(long id) {
          // access EntityManager or JDBCTemplates or Spring Data Repository
      }
}
+1

Source: https://habr.com/ru/post/1619261/


All Articles